私は自分のコントロールを作成したい、ctorが呼び出されるとMessageBoxが表示されます。WinRT - MessageDialog.ShowAsyncは、私のカスタムクラスでUnauthorizedAccessExceptionをスローします
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);
}
}
}
私のクラスが誰かによって使用されている場合、およびUnauthorizedAccessExceptionが常にdialog.ShowAsync();
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
MessageDialog dialog1 = new MessageDialog("");
dialog1.ShowAsync();
}
にスローされ、以下のようなコードを書く例外なくメッセージダイアログを表示する方法はありますか?
私は方法を見つけた、それを楽しむ!
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);
}
これは苦しいです。 UIが既に表示されているときは、メッセージボックスを表示することはできません。これは連動させる必要がありますが、もちろんやりにくいです。本当の治療法はありませんが、ワーカースレッドが自分でボックスを押すのを避けてください。 –
回避策としてShowDialogメソッドを変更する方法を見つける – glover
これは実際の修正ではありません。 ShowAsync()を呼び出すコードを書かなかった場合はどうなりますか?まだkaboom。 –