簡體   English   中英

MessageDialog - 需要等待用戶輸入

[英]MessageDialog - needs to wait for user input

我有一個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();

如果MessageDialogShow()的同步版本,我會沒事的,但MessageDialog的異步behvaior加上我的同步例程,加上交叉線程讓我感到困惑。 我想知道在后端ViewModel中繼續同步方法之前是否有人可以概述我需要做什么來等待MessageDialog上的用戶輸入。

先謝謝您的幫助。

請參閱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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM