我想模拟由
NavigationFailed
实例触发的 Frame
事件,以查看我的应用程序的行为方式,但我无法实现这一点。
我已经检查了文档(Frame.NavigationFailed,Frame.Navigate),我可以在其中找到如何处理事件的信息,但没有提及框架在什么情况下触发它。
换句话说,我必须找到一种方法让
Frame.Navigate
方法返回 false。根据文档,我必须在 NavigationFailedEventArgs.Handled
事件处理程序中将 Frame.NavigationFailed
属性设置为 true- 但我无法强制框架触发事件。
我尝试在
Frame.Navigate
方法中提供不正确的源页面类型参数,但它没有按我的预期工作 - 该方法只是抛出异常,而不是将其重定向到 NavigationFailed
事件处理程序。
我还尝试从
OnNavigatedTo
事件处理程序抛出异常,但结果与上面相同(这实际上是预期的,因为该事件在成功导航后被触发)。
在
Navigated
事件处理程序中引发异常应该发出 NavigationFailed
。
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
ContentFrame.Navigated += ContentFrame_Navigated;
}
private void NavigationViewControl_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
try
{
var result = this.ContentFrame.Navigate(typeof(Page1));
// Doesn't get to this line.
if (result is false)
{
// Do something.
}
}
catch (Exception exception)
{
// Catches the NotImplementedException.
}
}
private void ContentFrame_Navigated(object sender, NavigationEventArgs e)
{
throw new NotImplementedException();
}
private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
e.Handled = true;
}
}
不幸的是,将
e.Handled
设置为 true
并不能阻止异常,因此您将无法从 Navigate
方法获得返回。我不确定这是设计使然还是错误,但我在 WinUI 3 存储库中创建了一个 issue。