single.php

C# WinUI3のContentDialog.ShowAsyncで”パラメーターが間違っています[0x80070057]”が発生する場合の対処法

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メソッドを呼び出した際に “パラメーターが間違っています。” が発生する人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です