選擇檔案
FileOpenPicker filePicker = new(); // 檔案選擇器
IntPtr hwnd = WindowNative.GetWindowHandle(this); // 取得視窗的 HWND
InitializeWithWindow.Initialize(filePicker, hwnd); // 設定父視窗
filePicker.FileTypeFilter.Add("*"); // 設定允許選擇的檔案類型(這裡設定為所有檔案類型)
// filePicker.FileTypeFilter.Add(".jpg"); // 只能 jpg
StorageFile file = await filePicker.PickSingleFileAsync(); // 開啟檔案選擇視窗
if (file != null)
{
Console.WriteLine($"已選擇檔案,檔案名稱:{file.Name}, 完整路徑:{file.Path}");
}
else
{
Console.WriteLine("取消選擇");
}
註: hWnd 是 Windows Handle (視窗手把)的縮寫,用來分辨和操作應用程式中不同的視窗。在 WinUI 中需要替 FileOpenPicker 等選擇器指定開啟的視窗。
選擇多個檔案
FileOpenPicker filePicker = new(); // 檔案選擇器
IntPtr hwnd = WindowNative.GetWindowHandle(this); // 取得視窗的 HWND
InitializeWithWindow.Initialize(filePicker, hwnd); // 設定父視窗
filePicker.FileTypeFilter.Add("*"); // 設定允許選擇的檔案類型(這裡設定為所有檔案類型)
IReadOnlyList<StorageFile> files = await filePicker.PickMultipleFilesAsync(); // 開啟檔案選擇視窗
if (files != null)
{
foreach (StorageFile file in files)
{
Console.WriteLine($"已選擇檔案,檔案名稱:{file.Name}, 完整路徑:{file.Path}");
}
}
else
{
Console.WriteLine("取消選擇");
}
選擇資料夾
FolderPicker folderPicker = new(); // 資料夾選擇器
IntPtr hwnd = WindowNative.GetWindowHandle(this); // 取得視窗的 HWND
InitializeWithWindow.Initialize(folderPicker, hwnd); // 設定父視窗
StorageFolder folder = await folderPicker.PickSingleFolderAsync(); // 開啟資料夾選擇視窗
if (folder != null)
{
Console.WriteLine($"已選擇資料夾,資料夾名稱:{folder.Name}, 完整路徑:{folder.Path}");
}
else
{
Console.WriteLine("取消選擇");
}
選擇儲存檔案位置
string defaultFileName = "test.txt";
FileSavePicker savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; // 設定預設的資料夾(文件)
savePicker.FileTypeChoices.Add("Text", new List<string>() { ".txt" }); // 設定允許選擇的檔案類型(這裡設定為 txt 檔案)
savePicker.SuggestedFileName = defaultFileName; // 設定預設的檔案名稱
IntPtr hwnd = WindowNative.GetWindowHandle(this); // 取得視窗的 HWND
InitializeWithWindow.Initialize(savePicker, hwnd); // 設定父視窗
StorageFile file = await savePicker.PickSaveFileAsync(); // 開啟檔案儲存視窗
if (file != null)
{
string filePath = file.Path;
Console.WriteLine($"已選擇要儲存檔案的路徑和檔名,檔案名稱:{file.Name}, 完整路徑:{filePath}");
// TODO: 寫入檔案
}
else
{
Console.WriteLine("未選擇檔案");
}
參考資料:
Microsoft.Learn - Call interop APIs from a .NET app
Microsoft.Learn - Retrieve a window handle (HWND)
GitHub - Microsoft/WinUI-Gallery/blob/main/WinUIGallery/ControlPages/FilePickerPage.xaml.cs
GitHub - Microsoft/WinUI-Gallery/blob/main/WinUIGallery/Helper/WindowHelper.cs
GitHub - Microsoft/WindowsAppSDK - How to use FilePicker and FolderPicker in WinUI 3 and other desktop-based apps #1188
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com