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
似乎没有任何效果,或者它从来没有打算做文档欺骗我相信它可能打算做的事情。
我尝试像 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
似乎没有任何效果,或者它从来没有打算做文档欺骗我相信它可能打算做的事情。