この記事はWindows App SDK Preview 3をベースにしています。
今回の目標はファイル選択ダイアログを表示することです。
WinUI3 DesktopではUWPと同じようにFileOpenPickerを使います。フォルダを選択したい場合はFolderPickerです。
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
Handle = this;
}
public static MainWindow Handle { get; private set; }
}
MainWindowのインスタンスをゲットできるようにしておいて…。
using MvvmGen;
using System;
using Windows.Storage.Pickers;
[ViewModel]
public partial class SamplePage1ViewModel
{
[Property]
private string sampleText = "N/A";
[Command]
private async void SampleButton()
{
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add("*");
InitializeWithWindow.Initialize(picker,
WindowNative.GetWindowHandle(MainWindow.Handle));
var file = await picker.PickSingleFileAsync();
if (file != null)
SampleText = file.Path;
}
}
FileOpenPickerを生成してファイル選択ダイアログを表示します。
InitializeWithWindow.Initialize
でダイアログのハンドルをメインウィンドウのハンドルで初期化しています。これがないとお約束のSystem.Runtime.InteropServices.COMException
の例外がまた発生してしまいます。
この回避策は、嫌な回避策です。Windows App SDKがこなれてきたら、いずれ不要になると思いたいです。
<StackPanel>
<TextBlock Name="SampleText" FontSize="100" Text="{Binding SampleText}"/>
<Button Content="Fire!" Command="{Binding SampleButtonCommand}"/>
</StackPanel>
そしてもちろん、XAMLでボタンを設置してコマンドにバインドします。
コマンドの実装にはMvvmGenを使用しています。MvvmGenを使わなくてもダイアログの表示はできます。[ViewModel]
属性、[Command]
属性についての詳細は以下の記事を参照してください。