C# ShowMetroDialogAsyncdoesn';等待任务时不显示对话框

C# ShowMetroDialogAsyncdoesn';等待任务时不显示对话框,c#,wpf,dialog,mahapps.metro,C#,Wpf,Dialog,Mahapps.metro,我尝试实现一个DialogManager,如所述。我没有使用caliburn,所以我进行了一些重构,而且它不再是SimpleDialog,而是CustomDialog,但没有太大的变化 现在,当我单击一个按钮调用DialogManager.ShowDialog并使用task.wait()等待生成的任务时,应用程序只是冻结(作为等待的一个方面),但没有显示对话框。我试着调试,但在上线之前它工作正常 await Application.Current.Windows.OfType<MetroW

我尝试实现一个DialogManager,如所述。我没有使用caliburn,所以我进行了一些重构,而且它不再是SimpleDialog,而是CustomDialog,但没有太大的变化

现在,当我单击一个按钮调用
DialogManager.ShowDialog
并使用
task.wait()
等待生成的任务时,应用程序只是冻结(作为等待的一个方面),但没有显示对话框。我试着调试,但在上线之前它工作正常

await Application.Current.Windows.OfType<MetroWindow>().First().ShowMetroDialogAsync(dialog);
等待Application.Current.Windows.OfType().First().ShowMetroDialogAsync(对话框);
。对话框是有效的
BaseMetroDialog
,我从
应用程序.Cur…
调用中获得了正确的窗口。当我刚刚调用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();
}
使用SysThread=System.Threading;
使用WpfThread=System.Windows.Threading;
使用SysTasks=System.Threading.Tasks;
使用MahCtl=MahApps.Metro.Controls;
使用MahDlg=MahApps.Metro.Controls.Dialogs;
使用Wpf=System.Windows;
.
.
.
私有SysThread.CancellationTokenSource令牌源;
.
.
.
MahCtl.MetroWindow parentMetroWindow=Wpf.Application.Current.Windows.OfType().First();
var metroDialogSettings=新的MahDlg.metroDialogSettings();
metroDialogSettings.OwnerCanCloseWithDialog=true//似乎没有任何效果
metroDialogSettings.AnimateHide=false;
metroDialogSettings.AnimateShow=false;
使用(tokenSource=new SysThread.CancellationTokenSource())
{
metroDialogSettings.CancellationToken=tokenSource.Token;
systask.Task=MahDlg.DialogManager.ShowMessageAsync(parentMetroWindow、title、message、mahStyle、metroDialogSettings);
parentMetroWindow.Closing+=onMainWindowClosing;
而(!(task.IsCompleted | | | task.IsCanceled | | | task.IsFaulted))
调用(WpfThread.DispatcherPriority.Background,新操作(委托{}));
parentMetroWindow.Closing-=onMainWindowClosing;
返回任务。结果;
}
.
.
.
MainWindowClosing上的私有无效(对象发送方,SysCompMod.CancelEventArgs CancelEventArgs)
{
tokenSource.Cancel();
}

主窗口的
关闭
事件的额外处理程序是必要的,以便处理用户试图通过任务栏关闭应用程序主窗口的情况,并且在模式对话框打开时,因为
所有者CancloseWithDialog
似乎没有任何效果,或者它从来没有打算做文档诱使我相信它可能打算做的事情。

为什么不使用
Application.Current.MainWindow.showmetrodialgasync…
?您的
应用程序.main窗口是否不是
MetroWindow
?请注意,“按设计”MahApps对话框是模态的,并显示在所属窗口的覆盖上。MahApps对话框按设计不是模态的,它是异步的,您无法单击任何其他内容,因为它位于窗口前面。但是无论如何,你是对的,我可以使用主窗口,虽然我不认为这会改变任何事情,因为我也得到了主窗口实例。是的,你完全正确,应该是显而易见的-不知道为什么我没有得出这个结论:谢谢你的回答,但这是很久以前的事了,所以我真的不能再检查它是否有效了……没关系。这是为了子孙后代。