C# WinForms/WPFアプリでタイトルバーの色などをカスタマイズする方法を調べていて、WinUI 3アプリでタイトルバーの色を変更する手順を備忘録的に投稿します。
WinUI 3 アプリでFileOpenPickerを利用
C#で、デスクトップの WinUI 3 アプリを作っている時に、表示されて困っていました。
こんな感じで、ファイルを選択する「開く」画面を表示する際に表示されます。
private async void Button_Click(object sender, RoutedEventArgs e)
{
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add("*");
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
ViewImage(file.Path.ToString());
}
}
エラーメッセージ「System.Runtime.InteropService.COMException: Invalid window handle. (0x80070578)」から考えると、ウィンドウのハンドルが不正らしい。
インスタンス化したオブジェクトを初期化が必要
詳しくは調べていませんが、デスクトップ アプリで使用されるWindows ランタイム (WinRT) オブジェクトを使用する場合には所有者のウィンドウが必要なようです。
IInitializeWithWindow::Initialize メソッド
PickSingleFileAsyncを使う直前にInitializeメソッドを挿入すると改善しました。
private async void Button_Click(object sender, RoutedEventArgs e)
{
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add("*");
InitializeWithWindow.Initialize(picker, WindowNative.GetWindowHandle(this));
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
ViewImage(file.Path.ToString());
}
}
まとめ
今回は短い記事ですが、WinUI 3 アプリでFilePickerなどのWindows ランタイム (WinRT) オブジェクトを利用する場合には、InitializeWithWindow.Initializeメソッドを使って、所有者のウィンドウを指定する必要がありました。
指定しない場合にはエラー「System.Runtime.InteropService.COMException: Invalid window handle. (0x80070578)」が発生します。
C#で作成したアプリで「System.Runtime.InteropService.COMException: Invalid window handle. (0x80070578)」が表示される場合の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。