WPFでファイル選択ダイアログを表示する
WPFでWinRTWinRT APIを使用し、ファイル選択ダイアログ(ファイルピッカー)を表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using Windows.Storage; using Windows.Storage.Pickers; using WinRT.Interop; using System.Windows.Interop; ・・・ //ファイルピッカーのインスタンスを生成し、オプションを設定する var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.DocumentsLibrary }; picker.FileTypeFilter.Add(".txt"); //ウインドウハンドルを取得 var hwnd = new WindowInteropHelper(this).Handle; //ピッカーダイアログのハンドルをhwndで初期化し関連付ける InitializeWithWindow.Initialize(picker, hwnd); StorageFile file = await picker.PickSingleFileAsync(); var texts = await FileIO.ReadLinesAsync(file); |
■ウインドウハンドルの取得にWindowNative.GetWindowHandle()を使用すると、以下の例外が発生する。
System.ArgumentException: ‘Source object type is not a projected type and does not inherit from a projected type. Arg_ParamName_Name’
■ハンドルの初期化がないと以下の例外が発生する。
System.Runtime.InteropServices.COMException: ‘Invalid window handle. (0x80070578)
Consider WindowNative, InitializeWithWindow
■WindowInteropHelper クラスのHandleプロパティの代わりにEnsureHandle()メソッドを使うと、ウィンドウハンドルがまだ作成されていない場合は ウィンドウハンドルを作成して返す。
ウインドウハンドルの取得(WinUI / WPF / WinForm)
【Windows UI】
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
【WPF】
var hwnd = new WindowInteropHelper(this).EnsureHandle();
【Windows Form】
var hwnd = this.Handle;
【UWP】
不要
英単語
Interop 相互運用