我想编写自己的控件,当调用ctor时,显示一个MessageBox。
public class Class1
{
public Class1()
{
ShowDialog();
}
void ShowDialog()
{
SynchronizationContext context = SynchronizationContext.Current;
if (context != null)
{
context.Post((f) =>
{
MessageDialog dialog = new MessageDialog("Hello!");
dialog.ShowAsync();
}, null);
}
}
}
如果某人使用了我的类(class),并编写如下代码,则
dialog.ShowAsync();
中始终会抛出UnauthorizedAccessExceptionvoid MainPage_Loaded(object sender, RoutedEventArgs e)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
MessageDialog dialog1 = new MessageDialog("");
dialog1.ShowAsync();
}
有没有一种方法可以毫无异常(exception)地显示消息对话框?
我找到了一种享受的方式!
Task ShowDialog()
{
CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
Func<object, Task<bool>> action = null;
action = async (o) =>
{
try
{
if (dispatcher.HasThreadAccess)
await new MessageDialog("Hello!").ShowAsync();
else
{
dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => action(o));
}
return true;
}
catch (UnauthorizedAccessException)
{
if (action != null)
{
Task.Delay(500).ContinueWith(async t => await action(o));
}
}
return false;
};
return action(null);
}
最佳答案
由于MessageDialogue需要在UI线程上运行,因此您可以尝试将其切换为:
var dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
dispatcher.RunAsync(DispatcherPriority.Normal, <lambda for your code which should run on the UI thread>);
关于c# - WinRT-MessageDialog.ShowAsync将在我的自定义类中引发UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13813065/