В моем приложении 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 и мне нужно делать это вручную?
Это рабочий пример кода для 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.");
}
}
}
Последующие действия: похоже, проблема заключалась в вложенных фреймах. Чем больше ты знаешь.
Я буду проклят! Спасибо за рабочий пример, мне еще предстоит понять, чем вы отличались от меня, кроме того факта, что у вас есть рамка прямо в окне, а у меня она на странице.