2021年3月31日 星期三

[C#] FolderBrowserDialog 的替代品 Windows API CodePack CommonOpenFileDialog

markdown 跳出一個視窗讓 User 選擇某個資料夾,是一個非常常用的功能,.Net framework 裡也有內建了一個元件 `FolderBrowserDialog` 來提供這個功能,界面就像下面這個樣子。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpxwn2ka-XlXYOVl6F0DEMzfEtGESasY4DnieIetTd4RfkwqyTWUbImri-kCTci4XZiqzsXog-mRtKUfxXCDShTqYJwxV2dgFivVG2PWfpnkI1IYSI9QXryW6YnxhlVohgK8QhQSl-xkcu/) 不過可惜的是,這個內建的元件實在相當的難用,它有幾個問題 * 第一個是不能指定任意路徑作為根目錄,只有幾個她預設好的路徑可以給你用,例如桌面或是我的電腦。 * 第二個是沒有提供輸入框讓使用者可以先複製好路徑直接跳過去。 這兩個原因,讓使用者常常需要在樹狀結構的目錄點選好幾次才能選到想要的目錄,非常麻煩,可用性基本為零,更慘的是,.Net framework 一直沒有提供替代的元件,內建的就只有這一個,直到 .Net Core 才將這個元件做了改進。 不過如果不是自己私人的專案,是公司的案子,是沒有那麼容易讓你換平台的,很多公司可能還在用 .Net framework 3.5 呢,怎麼可能為了一個視窗讓你換到 .Net Core 呢? 好在微軟自己出了一個 3rd library:Windows API CodePack,裡面有很多好用的 GUI 元件,其中有一個 `CommonOpenFileDialog`就解決了這個問題,它的界面像下面這個樣子。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQXAECitT8fiw-8jmVPdzxb8yQlYnod9_LCdhlfxLGk7i3Og3GoVIOweeFrJRwf3bY5sDEBK220cVmQacCBWJQCyfoZ15-eRJ321HQ9qEIj6BhqfESaiIQn729lukbabrDiZg-5OAyvIkU/s0/dialog2.png) 程式碼也相當簡單。
using System;
using Microsoft.WindowsAPICodePack.Dialogs;

namespace ConsoleApplication1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var dialog = new CommonOpenFileDialog()
            {
                IsFolderPicker = true,
                InitialDirectory = @"F:",
            };

            dialog.ShowDialog();
        }
    }
}
不過不知道為什麼似乎微軟已經把這個 3rd library 拿掉了,也沒有在維護了,所以已經找不到它的官網,不過還是有人把它上傳到 [github](https://github.com/contre/Windows-API-Code-Pack-1.1),也有幫它做更新維護,甚至讓它支援到 .Net 5.0 了,想要使用的人還是可以在網上找到地方下載的。 --- * [How to use OpenFileDialog to select a folder?](https://stackoverflow.com/questions/11624298/how-to-use-openfiledialog-to-select-a-folder) * [Breaking changes for migration from .NET Framework to .NET Core](https://docs.microsoft.com/en-us/dotnet/core/compatibility/fx-core#modernization-of-the-folderbrowserdialog)

沒有留言:

張貼留言