👭

2 種類の FileOpenPicker

に公開

はじめに

WinUI 3 などで使用する「ファイルを開く」ダイアログが 2 種類あることについてです。

経緯

元々、FileOpenPicker(ファイルを開くダイアログ)などは Windows.Storage.Pickers 名前空間で提供されていました。

しかし、アプリが管理者権限で起動されていると動作しないという致命的な不具合が 2022 年 5 月に報告されました。しかも 3 年半に渡ってこの不具合は放置されます。

2025 年に解決の報告が上がりましたが、厳密には解決とは少し違います。元々の不具合は引き続き放置したうえで、新規に、名前も機能も同じ FileOpenPicker が別の名前空間(Microsoft.Windows.Storage.Pickers)で提供されるようになりました。

これにより、バグありの Windows.Storage.Pickers.FileOpenPicker(以降「旧版」と呼びます)と、バグなしの Microsoft.Windows.Storage.Pickers.FileOpenPicker(以降「新版」と呼びます)が並行して存在するという、非常に分かりづらい状況になりました。

多くの人は「分裂させずに、普通にバグ修正してくれ」と思ったのではないでしょうか。もしかしたら、UWP という負の遺産を引きずっていることが解決の難易度を上げていたりするのかもしれませんが、利用者からすると分裂は混乱以外の何者でもありません。

使い方

旧版

旧版は以下のようにして使用できます。

Windows.Storage.Pickers.FileOpenPicker fileOpenPicker = new();
InitializeWithWindow.Initialize(fileOpenPicker, App.MainWindow.GetWindowHandle());
fileOpenPicker.FileTypeFilter.Add("*");
fileOpenPicker.FileTypeFilter.Add(".jpg");
fileOpenPicker.FileTypeFilter.Add(".png");

Windows.Storage.StorageFile? file = await fileOpenPicker.PickSingleFileAsync();
if (file == null)
{
	return;
}

await App.MainWindow.ShowMessageDialogAsync(file.Path, "ファイルを開く");

新版

新版の使い方も、名前空間が違うだけで基本的には同じです。

親ウィンドウの指定方法がハンドルから ID に変わっているところが多少の変更点です。

Microsoft.Windows.Storage.Pickers.FileOpenPicker fileOpenPicker = new(App.MainWindow.AppWindow.Id);
fileOpenPicker.FileTypeFilter.Add("*");
fileOpenPicker.FileTypeFilter.Add(".jpg");
fileOpenPicker.FileTypeFilter.Add(".png");

Microsoft.Windows.Storage.Pickers.PickFileResult? file = await fileOpenPicker.PickSingleFileAsync();
if (file == null)
{
	return;
}

await App.MainWindow.ShowMessageDialogAsync(file.Path, "ファイルを開く");

見た目もほとんど同じですが、フィルター部分が多少変わっています。新版は拡張子が括弧でくくられており、表示方法にちょっと違和感があります。

FileSavePicker や FolderPicker も使い方は同様です。

まとめ

分裂してしまったものはどうしようありません。

新版は表示方法に多少の違和感はありますが、バグは無い方が良いので、利用者としては今後は可能な限り新版を使うということでいいのではないでしょうか。

確認環境

項目 環境
OS Windows 11 Pro 25H2
Visual Studio 2026 18.0.0
.NET 10.0
Template Studio for WinUI 5.5
WinUIEx 2.9.0
Windows App SDK 1.8.251106002 (1.8.3)

参考リンク

Discussion