首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MessageDialog -需要等待用户输入

MessageDialog -需要等待用户输入
EN

Stack Overflow用户
提问于 2013-06-24 19:55:04
回答 1查看 3.6K关注 0票数 3

我有一个用同步方法实例化事件的ViewModel。该事件向UI发出信号,指示我们需要用户在继续之前回答“是”或“否”。

我正在尝试显示一个MessageDialog,并等待用户提供答案-是或否。我很难做到这一点。我目前在尝试这样做的时候得到了一个UnauthorizedAccessException

下面是UI中的代码:

代码语言:javascript
复制
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;
}

我试过了:

代码语言:javascript
复制
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线程锁定。

代码语言:javascript
复制
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的异步行为,再加上我的同步例程,再加上交叉线程,让我感到困惑。我想知道是否有人可以概述一下,在后端ViewModel中继续同步方法之前,我需要做些什么来等待MessageDialog上的用户输入。

提前感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 20:08:01

参见Win8 C# Metro dispatcher and RPC_E_WRONG_THREADCoreDispatcher.RunAsync

因为您的方法不是在Dispatcher上执行的,所以您需要手动调用它上的代码。为了避免重构为回调模式,您可以使用TaskCompletionSource(T)来设置结果,后台线程将在设置结果后继续。

代码语言:javascript
复制
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;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17274865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档