MessageDialog-需要等待用户输入
本文关键字:用户 输入 等待 MessageDialog- | 更新日期: 2023-09-27 18:19:44
我有一个ViewModel,它在同步方法中实例化一个事件。该事件向UI发出信号,表示在继续之前,我们需要用户给出"是"或"否"的回答。
我正在尝试显示MessageDialog
,并等待用户提供答案——是或否。我很难做到这一点。我目前在尝试这样做时得到了UnauthorizedAccessException
。
以下是UI中的代码:
async Task<bool> Instance_SwitchConfirmation(string question)
{
MessageDialog md = new MessageDialog(question);
md.Commands.Add(new UICommand("Yes", CommandInvokedHandler));
md.Commands.Add(new UICommand("No", CommandInvokedHandler));
md.ShowAsync();
return this.canSwitch;
}
async void CommandInvokedHandler(IUICommand command)
{
this.canSwitch = command.Label == "Yes" ? true : false;
}
我试过:
var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => {
MessageDialog md = new MessageDialog(question);
md.Commands.Add(new UICommand("Yes", CommandInvokedHandler));
md.Commands.Add(new UICommand("No", CommandInvokedHandler));
md.ShowAsync();
},
new System.Threading.CancellationToken(),
TaskCreationOptions.PreferFairness, uiContext);
但除了同样的例外,这项操作失败了。
最后,如果我只是像这样等待MessageDialog,那么对话框不会显示,UI线程也会锁定。
MessageDialog md = new MessageDialog(question);
md.Commands.Add(new UICommand("Yes", CommandInvokedHandler));
md.Commands.Add(new UICommand("No", CommandInvokedHandler));
await md.ShowAsync();
如果MessageDialog
有Show()
的同步版本,我会很好,但MessageDialog
的异步行为加上我的同步例程,再加上交叉线程,让我很困惑。我想知道是否有人能概述一下我需要做什么来等待MessageDialog
上的用户输入,然后在我的后端ViewModel中继续同步方法。
提前感谢您的帮助。
请参阅Win8 C#Metro调度器以及RPC_E_WRONG_THREAD和CoreDispatcher.RunAsync
。
由于您的方法没有在Dispatcher
上执行,因此需要手动调用它上的代码。为了避免重构为回调模式,您可以使用TaskCompletionSource(T)
来设置结果,并且后台线程将在设置结果后继续。
var tcs = new TaskCompletionSource<bool>();
var dialogTask = tcs.Task;
MessageDialog md = new MessageDialog(question);
md.Commands.Add(new UICommand("Yes"));
md.Commands.Add(new UICommand("No"));
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => {
var result = await md.ShowAsync();
var canSwitch = result.Label == "Yes";
tcs.SetResult(canSwitch);
});
var result = await dialogTask;
return result;