[英]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();
如果MessageDialog
有Show()
的同步版本,我會沒事的,但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.