C# WinUI 3 選擇檔案、選擇多個檔案、選擇儲存檔案路徑、選擇資料夾 示範

選擇檔案

    
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

留言