Стек навигации по кадрам C# WinUI 3

В моем приложении WinUI3 С# у меня есть фрейм со страницей содержимого. Учитывая, что я установил для IsNavigationStackEnabled значение true во фрейме, я ожидаю, что текущая страница будет помещена в стек навигации при переходе (используя MyFrame.Navigate(...)), чтобы я мог использовать MyFrame.GoBack() для возврата на предыдущую страницу.

Однако попытка вызвать MyFrame.GoBack() после перехода с одной страницы на другую всегда приводит к исключению: System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.'. Более того, CanGoBack-свойство всегда false.

Я что-то упустил или стек навигации просто не управляется фреймом в WinUI3 и мне нужно делать это вручную?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это рабочий пример кода для Frame навигации. Обратите внимание, что в коде нет IsNavigationStackEnabled. IsNavigationStackEnabled по умолчанию true.

MainWindow.xaml

<Grid ColumnDefinitions = "*,*">
    <StackPanel
        Grid.Column = "0"
        Orientation = "Vertical">
        <StackPanel Orientation = "Horizontal">
            <Button
                x:Name = "Page1Button"
                Click = "Page1Button_Click"
                Content = "Page1" />
            <Button
                x:Name = "Page2Button"
                Click = "Page2Button_Click"
                Content = "Page2" />
            <Button
                x:Name = "Page3Button"
                Click = "Page3Button_Click"
                Content = "Page3" />
        </StackPanel>
        <StackPanel Orientation = "Horizontal">
            <Button
                x:Name = "BackButton"
                Click = "BackButton_Click"
                Content = "Back" />
            <Button
                x:Name = "NextButton"
                Click = "NextButton_Click"
                Content = "Next" />
        </StackPanel>
        <Frame x:Name = "NavigationFrame" />
    </StackPanel>
    <ListView Grid.Column = "1" ItemsSource = "{x:Bind NavigationLogs}" />
</Grid>

MainWindow.xaml.cs

using Microsoft.UI.Xaml;
using System;
using System.Collections.ObjectModel;

namespace Frames;

public sealed partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        NavigateTo(typeof(Page1));
    }

    private ObservableCollection<string> NavigationLogs { get; } = new();

    private void BackButton_Click(object sender, RoutedEventArgs e)
    {
        NavigateBack();
    }

    private void NextButton_Click(object sender, RoutedEventArgs e)
    {
        NavigateForward();
    }

    private void Page1Button_Click(object sender, RoutedEventArgs e)
    {
        NavigateTo(typeof(Page1));
    }

    private void Page2Button_Click(object sender, RoutedEventArgs e)
    {
        NavigateTo(typeof(Page2));
    }

    private void Page3Button_Click(object sender, RoutedEventArgs e)
    {
        NavigateTo(typeof(Page3));
    }

    private void NavigateTo(Type pageType)
    {
        this.NavigationFrame.Navigate(pageType);
        NavigationLogs.Add($"Navigated to {pageType}.");
    }

    private void NavigateBack()
    {
        if (this.NavigationFrame.CanGoBack is true)
        {
            this.NavigationFrame.GoBack();
            NavigationLogs.Add("Navigated back.");
        }
        else
        {
            NavigationLogs.Add("Cannot to navigate back.");
        }
    }

    private void NavigateForward()
    {
        if (this.NavigationFrame.CanGoForward is true)
        {
            this.NavigationFrame.GoForward();
            NavigationLogs.Add("Navigated forward.");
        }
        else
        {
            NavigationLogs.Add("Cannot to navigate forward.");
        }
    }
}

Я буду проклят! Спасибо за рабочий пример, мне еще предстоит понять, чем вы отличались от меня, кроме того факта, что у вас есть рамка прямо в окне, а у меня она на странице.

Mark 06.11.2022 22:04

Последующие действия: похоже, проблема заключалась в вложенных фреймах. Чем больше ты знаешь.

Mark 07.11.2022 22:40

Другие вопросы по теме