C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで、ContentDialogを表示するShowAsyncメソッドを呼び出した際に “パラメーターが間違っています。” が発生する場合の対処法です。
パラメーターが間違っています
例えば、次のコードを実行した場合に例外が発生する場合があります。
var dialog = new ContentDialog()
{
Title = "Error",
Content = "Error",
CloseButtonText = "OK",
XamlRoot = this.Content.XamlRoot
};
ContentDialogResult result = await dialog.ShowAsync();
if (result == ContentDialogResult.None)
{
this.Close();
}
System.ArgumentException
HResult=0x80070057
Message=パラメーターが間違っています。This element does not have a XamlRoot. Either set the XamlRoot property or add the element to a tree.
よくあるケースとして、UIが使えない状態(例えばLoadedイベントの前段階)の場合にはXamlRootが取得できないために例外が発生してしまいます。
XamlRootが有効になるまで待つ
Loadedイベント以降に表示処理をした方が確実ですが、アプリケーションの初期化処理でメッセージを表示したいような場合もあります。
次のコードで、XamlRootが有効になるまで待つ方法があります。
//XamlRootが有効になるまで待つ
while (this.Content?.XamlRoot == null)
{
await Task.Delay(50);
}
var dialog = new ContentDialog()
{
Title = "Error",
Content = "Error",
CloseButtonText = "OK",
XamlRoot = this.Content.XamlRoot
};
ContentDialogResult result = await dialog.ShowAsync();
if (result == ContentDialogResult.None)
{
this.Close();
}
実行するとアプリでUIが有効になった後にダイアログ画面が表示されます。
まとめ
今回は、短い記事ですが、WinUI3プロジェクトで、ContentDialogを表示するShowAsyncメソッドを呼び出した際に “パラメーターが間違っています。” が発生する場合の対処法について書きました。
アプリのUIが利用できない状態でダイアログを表示しようとしているのがケースで発生します。
回避するには、Loadedイベント以降の処理で実行するかXamlRootが有効になるまで待つという方法があります。
WinUI 3 アプリでShowAsyncメソッドを呼び出した際に “パラメーターが間違っています。” が発生する人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。

