为什么这个 C# 代码乱序执行?不是 ASYNC(至少我认为不是)

马特

任何人都可以帮助我理解为什么在 CanNavigateAway 函数返回其值后执行我对 dialogservice 的调用?(我的目标是警告用户他们将要离开视图而不保存更改。如果他们单击“确定”,则允许导航。我正在使用 MVVM Light。

当我单步执行代码时,它确实到达了对话服务,但在创建对话之前继续到 CanNavigateAway 的末尾。CanNavigateAway 方法由 OnNavigatingFrom 调用。

public bool CanNavigateAway()
    {
        if (!changesSaved && Model.IsModified && !continueNavigation)
        {             
              dialogService.ShowMessage("Are you sure you want to continue?",
              "Confirmation",
              buttonConfirmText: "Continue", buttonCancelText: "Discard",
              afterHideCallback: (confirmed) =>
              {
                  if (confirmed)
                  {
                      // User has pressed the "confirm" button.
                      // ...
                      continueNavigation = true;
                  }
                  else
                  {
                      // User has pressed the "cancel" button
                      // (or has discared the dialog box).
                      // ...
                      continueNavigation = false;
                  }
              });
            return continueNavigation;
        }
}

这是来自 MVVM Light Bindable Page 类的 OnNavigatingFrom 方法:

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        var navigableViewModel = this.DataContext as INavigable;

        if (navigableViewModel != null)
        {
            if (!navigableViewModel.CanNavigateAway())
            {
                e.Cancel = true;
            }
        }
    }

我尝试了一种不同的方式来让对话服务摆脱困境,但 showConfirmationDialogAsync 似乎仍然没有及时执行:

public bool CanNavigateAway()
{
    continueNavigation = false;
    if (!changesSaved && Model.IsModified && !continueNavigation)
    {
        showConfirmationDialogAsync();
        return continueNavigation;
    }  

private async void showConfirmationDialogAsync()
{
    continueNavigation = false;
    ContentDialog noSaveConfirmation = new ContentDialog
    {
        Title = "Warning",
        Content = "You have unsaved changes. Are you sure you want to leave this page without saving?",
        PrimaryButtonText = "Leave without saving",
        SecondaryButtonText = "Stay and finish"
    };

    ContentDialogResult result = await noSaveConfirmation.ShowAsync();

    if (result == ContentDialogResult.Primary)
    {
        continueNavigation = true;
    }
    else if (result == ContentDialogResult.Secondary)
    {
        continueNavigation = false;
    }
}        
马丁·齐克蒙德

如果您需要用户的响应,则所有解决方案都不起作用。问题在于,当代码在导航事件处理程序中时,它在 UI 线程上运行并且用户提示异步运行,因此 UI 可以自由地向用户呈现对话框。然而,这意味着事件处理程序在用户有机会响应之前完成。

但是,您可以使用变通解决方案。添加一个标志bool字段,如forceNavigation. 然后在里面OnNavigatingFrom向用户显示对话框并设置Canceltrue立即向用户显示确认对话框。如果用户说是,则设置forceNavigaiton为 true 并再次手动触发导航。现在它将跳过确认部分并立即导航。

protected async override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{ 
    //if navigation is forced, skip all logic
    if ( !forceNavigation )
    {
        var navigableViewModel = this.DataContext as INavigable;

        if (navigableViewModel != null)
        {
            e.Cancel = true;
            //display the dialog to the user, if he says yes, set
            //forceNavigation = true; and repeat the navigation (e.g. GoBack, ... )
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++:为什么这个constexpr不是编译时间常数

为什么这个 c 代码的结果是“days: 33”而不是“days: 30”?

为什么这个'C'代码的输出是这样的?

为什么这个 C++ 方法执行最后定义的对象的主体而不是由于指向死对象而失败?

为什么这个变量不是对象?

为什么这个循环不是无限

为什么是这个val,而不是val?

为什么这个图像不是水平渐变?

为什么这个函数不是尾递归的?

为什么这个过渡淡出而不是淡入?

为什么我的C ++代码看不到这个C#类成员?

为什么它不让我执行这个?

C 结构:为什么这个语句使用 . 符号来访问“赃物”而不是 ->?

为什么我不能从这个 C 代码访问在汇编中声明的 Tss 变量?

为什么我在这个 C 代码中得到了错误的答案?

为什么这个程序的输出不是我的想法

为什么我看到这个大数字而不是零?

为什么这个钻石类继承输出不是我期望的?

为什么我得到这个“ res.render()不是函数”

为什么这个`ctypes` 包装函数的返回值是`c_long(0)` 而不是`c_long(3)`?

Rails MiniTest,为什么这个过程不是成功而不是错误?

为什么这个 C 代码会产生无限循环?

谁能让我理解为什么 Visual Studio 会针对我的 C++ 代码给我这个警告?

为什么 webpack 认为我的模块不是模块?

为什么这个有效的 Python 代码不是有效的 Ansible Python 代码

为什么我的文件在 C 中分叉时即使有守卫也执行两次这个头文件?

为什么这个C程序不能让我访问内存?

为什么这个 Python 语法错误不是错误?

为什么这个函数在 golang 中不是线程安全的?