c# - MessageDialog - 需要等待用户输入

标签 c# microsoft-metro async-await messagedialog

我有一个 ViewModel,它以同步方法实例化一个事件。该事件向 UI 发出信号,表明在继续之前我们需要用户回答"is"或“否”。

我正在尝试显示一个 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 的异步行为加上我的同步例程,加上交叉线程让我感到困惑。我想知道是否有人可以概述在我的后端 ViewModel 中继续同步方法之前我需要做什么来等待用户在 MessageDialog 上输入。

在此先感谢您的帮助。

最佳答案

参见 Win8 C# Metro dispatcher and RPC_E_WRONG_THREADCoreDispatcher.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;

关于c# - MessageDialog - 需要等待用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274865/

相关文章:

c# - TripleDESCryptoServiceProvider.Blocksize 不同于 PHP 的 mcrypt_get_key_size

C# AES Base64 加密(字符串)

google-maps-api-3 - Google Places API 和 Windows 8 Metro Style 应用程序

c# - Windows 8 Metro 中的 SSDP 发现不可靠

javascript - 异步等待 JSON 返回

c# - 将函数包装为异步任务

c# - 不聚焦,但允许互动?

c# - C# 中的显式方法表而不是 OO - 好吗?坏的?

wpf - Metro 风格 (WinRT) UI 是否适合企业应用程序?

javascript - 我需要一个 Promise 中的 Promise 及其 .then 先运行