ShowMetroDialogAsync 在等待任务时不显示对话框

ShowMetroDialogAsyncdoesn't show the dialog when waiting for the task

我尝试像 here 描述的那样实现 DialogManager。我没有使用caliburn,所以我重构了一点,也不再是SimpleDialog而是CustomDialog,但是没有太大的变化。

所以现在,当我单击调用 DialogManager.ShowDialog 的按钮并使用 task.Wait() 等待生成的任务时,应用程序只是冻结(等待方面)但不显示对话框。我尝试调试,但在

行之前一切正常
await Application.Current.Windows.OfType<MetroWindow>().First().ShowMetroDialogAsync(dialog);

。对话框是有效的 BaseMetroDialog,我从 Application.Cur... 调用中得到正确的 window。当我只是调用 ShowMessageAsync 时也会发生这种情况,所以问题似乎出在调用的连接和等待任务上。有没有办法真正阻止下面的执行(强制对话框是模态的)?

如果您需要其他信息,请发表评论,我会扩展问题,但现在除了开头已经链接的代码外,我不知道要显示什么。

你提到了 task.Wait()。如果您启动了一项显示对话框的任务,恐怕您无法做到这一点。 GUI 是单线程的。您仍然可以等待结果,只需从主线程启动,而不是任务。

这是我必须做的所有噱头,以便在无需使用 async/await:

的情况下使其正常工作
using SysThread = System.Threading;
using WpfThread = System.Windows.Threading;
using SysTasks = System.Threading.Tasks;
using MahCtl = MahApps.Metro.Controls;
using MahDlg = MahApps.Metro.Controls.Dialogs;
using Wpf = System.Windows;
.
.
.
private SysThread.CancellationTokenSource tokenSource;
.
.
.
    MahCtl.MetroWindow parentMetroWindow = Wpf.Application.Current.Windows.OfType<MahCtl.MetroWindow>().First();
    var metroDialogSettings = new MahDlg.MetroDialogSettings();
    metroDialogSettings.OwnerCanCloseWithDialog = true; //does not appear to have any effect
    metroDialogSettings.AnimateHide             = false;
    metroDialogSettings.AnimateShow             = false;
    using( tokenSource = new SysThread.CancellationTokenSource() )
    {
        metroDialogSettings.CancellationToken = tokenSource.Token;
        SysTasks.Task<MahDlg.MessageDialogResult> task = MahDlg.DialogManager.ShowMessageAsync( parentMetroWindow, title, message, mahStyle, metroDialogSettings );
        parentMetroWindow.Closing += onMainWindowClosing;
        while( !(task.IsCompleted || task.IsCanceled || task.IsFaulted) )
            Wpf.Application.Current.Dispatcher.Invoke( WpfThread.DispatcherPriority.Background, new Action( delegate { } ) );
        parentMetroWindow.Closing -= onMainWindowClosing;
        return task.Result;
    }
.
.
.
private void onMainWindowClosing( object sender, SysCompMod.CancelEventArgs cancelEventArgs )
{
    tokenSource.Cancel();
}

主window的Closing事件的额外处理程序是必要的,以便处理用户试图通过任务栏,当模式对话框打开时,因为 OwnerCanCloseWithDialog 似乎没有任何效果,或者它从来没有打算做文档欺骗我相信它可能打算做的事情。