.net 在WFP MahApps应用程序中,还原;e、 取消“;假不';行不通
在下面的async OnNavigating处理程序中,将e.Cancel还原为false应该允许用户导航离开当前页面。不知何故,导航意外失败.net 在WFP MahApps应用程序中,还原;e、 取消“;假不';行不通,.net,wpf,mahapps.metro,.net,Wpf,Mahapps.metro,在下面的async OnNavigating处理程序中,将e.Cancel还原为false应该允许用户导航离开当前页面。不知何故,导航意外失败 private async void NavigationService_OnNavigating(object sender, NavigatingCancelEventArgs e) { var model = DataContext as ViewModel; if (model == null || !model.IsD
private async void NavigationService_OnNavigating(object sender, NavigatingCancelEventArgs e)
{
var model = DataContext as ViewModel;
if (model == null || !model.IsDirty) return;
e.Cancel = true;
var option = MessageDialogResult.Negative;
try
{
var metroWindow = (MainWindow)Application.Current.MainWindow;
option = await metroWindow.ShowMessageAsync("Form", "Quit?", MessageDialogStyle.AffirmativeAndNegative);
}
finally
{
if (option == MessageDialogResult.Affirmative)
//******Allow the user to move away********
e.Cancel = false;
}
}
谁能解释一下这个问题吗?有什么与.Net线程相关的吗
更新:
使用决策变量\u canNavigate
已不公平地解决了该问题
private bool _canNavigate = false;
private async void NavigationService_OnNavigating(object sender, NavigatingCancelEventArgs e)
{
var model = DataContext as ViewModel;
if (model == null || !model.IsDirty) return;
if (!_canNavigate)
{
e.Cancel = true;
var metroWindow = (MainWindow)Application.Current.MainWindow;
var option = await metroWindow.ShowMessageAsync("Form", "Quit?", MessageDialogStyle.AffirmativeAndNegative);
if (option == MessageDialogResult.Affirmative)
{
_canNavigate = true;
_navigationService.Navigate(e.Uri);
}
else _canNavigate = false;
}
else
{
_canNavigate = false;
}
}
使用决策变量
\u canNavigate
已不公平地解决了该问题
private bool _canNavigate = false;
private async void NavigationService_OnNavigating(object sender, NavigatingCancelEventArgs e)
{
var model = DataContext as ViewModel;
if (model == null || !model.IsDirty) return;
if (!_canNavigate)
{
e.Cancel = true;
var metroWindow = (MainWindow)Application.Current.MainWindow;
var option = await metroWindow.ShowMessageAsync("Form", "Quit?", MessageDialogStyle.AffirmativeAndNegative);
if (option == MessageDialogResult.Affirmative)
{
_canNavigate = true;
_navigationService.Navigate(e.Uri);
}
else _canNavigate = false;
}
else
{
_canNavigate = false;
}
}
我不知道Cancel属性是如何工作的,但为什么要先将其设置为true,然后根据对话框进行更改?在if中添加一个else不是更有意义吗(option==…语句,带有e.Cancel=true?如果您注释掉
e.Cancel=true;
,它是否有效?如果它仍然不起作用,那么您可能会有另一个EventHandler取消导航。@Nathan您是否放弃了这个问题?您是否解决了它?@FishySwede@haindl谢谢您的注释!将e.Cancel设置为true将挂起此操作。@Nathan导航。如果在metroWindow.ShowMessageAsync
之后执行,暂停将不会成功。这可能是因为ShowMessageAsync
是异步的,并且显示的对话框不是模态的——UI仍然可以“自由”运行。@FishyWede感谢您的建议!完成!