起因
自己在MainWindow.xaml里自定义了两个page,通过导航的方式实现页面转换,然后在page的cs文件下定义函数。参考官方例子(WinUI3Gallery)写了一个文件夹选取函数,但是通过在Github查找源码,发现WindowHelper类是在程序内部定义的。。。直接抄过来不能用,然后为了解决获取当前窗口的问题被折磨了一整天。
解决办法
一、创建一个MainWindow静态变量
在MianWindow类下新建一个静态变量,这样在需要获取MainWindow时直接调用MainWindow.mainWindow即可:
public sealed partial class MainWindow : Window
{
public static MainWindow mainWindow;
public MainWindow()
{
this.InitializeComponent();
mainWindow = this;
}
}
一个简单的文件夹选取函数,返回选取路径:
public async Task<string> SelectPath()
{
FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker();
//获取句柄时使用静态变量
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(MainWindow.mainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);
folderPicker.FileTypeFilter.Add("*");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
return folder.Path;
return "NULL";
}
二、新建一个MainWindow
不知道用起来会不会有其他问题,但能跑😂。
public static async Task<string> SelectPath()
{
//新建一个MainWindow,用完之后关闭
var window=new MainWindow();
FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker();
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(@this);
WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);
folderPicker.FileTypeFilter.Add("*");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
//不手动关闭的话,调试状态下即使关闭窗口也无法自动停止调试,说明依然占用着资源。
window.Close();
if (folder != null)
return folder.Path;
return "NULL";
}
后言
顺便问一个问题,有没有哪位兄贵知道为什么Git了Winui3Gallery到本地之后依赖项全部带感叹号呀😭,甚至属性都是空的,感觉是路径设置有问题,但不知道咋改😥