问题背景
一些应用场景中,我们常常需要调用文件对话框操作本地文件,如打开、保存、选择等。通常采用的是Windows.Storage.Pickers
而WinUI 3 Desktop中直接声明Picker、调用ShowAsync()
则会抛出意外的错误。
这说明,WinUI 3 Desktop不能直接调用Windows.Storage.Pickers
下的文件对话框。
问题分析
通过在网上查询,发现WindowsAppSDK仓库下已经有相关Issue解决这个问题。
In desktop-based apps (like WinUI 3 desktop or WPF MSIX), The FileOpenPicker, FileSavePicker, and FolderPicker APIs require a HWND associated with them, so that they know which window to display over.
根据相关描述,这是Desktop与UWP平台差异导致的,在使用文件对话框前需要手动获取窗口句柄用来将picker初始化。故,添加如下代码即可(以FilePicker举例,其它Pickers亦是如此):
// var picker = new FileOpenPicker();
// 传入MainWindow实例,获取窗口句柄。
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
// 将句柄用于初始化Picker。
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
// 正常使用Picker。
// var file = await picker.PickSingleFileAsync();
总结&收获
开源项目在Github Issues中多半都能找到报告和解决方案,如果没有,撰写Issue会是不错的选择。