【问题标题】:Folder browser dialog like open file dialog文件夹浏览器对话框,如打开文件对话框
【发布时间】:2012-06-12 04:37:01
【问题描述】:

请看下面的快照。这取自 Visual Studio 2008 中的“新项目创建”工作流。

此窗口用于选择将存储项目的文件夹。如何在我的 c# 应用程序中创建类似的窗口?

【问题讨论】:

  • this question。基本上它们似乎是标准文件 open dialg 的子类。
  • @UweKeim:该问题线程中解释的子类化在哪里?他回答说他最终使用了 VistaBridge
  • 前段时间我下载了 VistaBride 并查看了他们如何做到这一点的来源。 IIRC 它是标准文件打开对话框的子类。
  • +1 表示您提出的问题实际上得到了您所要求的确切解决方案的回答。
  • 作为解决方案,我使用了SaveFileDialogzero-width space symbol 作为文件名插入。然后我就用Path.GetFullPath 剥离了路径。

标签: c# winforms


【解决方案1】:

这与 Office 中的类似,一个允许选择文件夹的对话框。 唯一的区别是选择文件夹按钮被命名为“确定”而不是“选择文件夹”。

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Core.FileDialog fileDialog = app.get_FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFolderPicker);
fileDialog.InitialFileName = "c:\\Temp\\"; //something you want
int nres = fileDialog.Show();
if (nres == -1) //ok
{
    Microsoft.Office.Core.FileDialogSelectedItems selectedItems = fileDialog.SelectedItems;

    string[] selectedFolders = selectedItems.Cast<string>().ToArray();

    if (selectedFolders.Length > 0)
    {
        string selectedFolder = selectedFolders[0];
    }
}

当然,您需要添加对 Microsoft.Office.Core(Microsoft Office 14.0 对象库)和 Microsoft.Office.Interop.Excel(Microsoft Excel 14.0 对象库)的引用。

【讨论】:

    【解决方案2】:

    我找到了一篇关于默认 FolderBrowserDialog 及其限制的好文章: http://www.ssware.com/articles/folderbrowserdialog-unmasked-everything-you-wanted-to-know-about-the-folder-browser-component-from-dotnet-framework.htm

    有一个来自 ssware 的第三方组件“Shell MegaPack”(http://www.ssware.com/megapack.htm),它为 WinForms、ASP.net 和 WPF 提供诸如文件和文件夹浏览器控件的 Windows 资源管理器。

    【讨论】:

      【解决方案3】:

      如果您可以添加 nuget 包,Microsoft.WindowsAPICodePack.Shell 有一个CommonOpenFileDialog,可以在“文件夹模式”下使用,这应该符合您的预期用途。

      var directoryDialog = new CommonOpenFileDialog
        {
           IsFolderPicker = true,
           Title = "Select Folder"
        };
      

      【讨论】:

        【解决方案4】:

        我将代码从 C# 修改为 VB,我的环境是 VS2015 + Office 2010。我的代码与 Daniel 的代码略有不同,因为 Daniel 的代码中的某些功能仅支持 Office 2003/2007

        通过使用新的 excel 实例,它会比打开 OpenFileDialog 或 OpenFolderDialog 慢,但它对用户更友好。我的程序只调用了这个代码一次,所以在我的情况下,为了用户友好而牺牲性能并不是一个问题。

        Imports Microsoft.Office
        Imports Excel = Microsoft.Office.Interop.Excel
        
        Private Sub Button_select_raw_dir_Click(sender As Object, e As EventArgs) Handles Button_select_raw_dir.Click
            Dim raw_app As Excel.Application = New Excel.Application
            Dim raw_data_open_folder_dialog As Microsoft.Office.Core.FileDialog
            raw_data_open_folder_dialog = raw_app.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFolderPicker)
            raw_data_open_folder_dialog.AllowMultiSelect = False
            raw_data_open_folder_dialog.Title = "Please select the raw data's dir "
            Dim nres As Integer = raw_data_open_folder_dialog.Show()
            Dim sz_SelectedPath As String = Nothing
            If nres = -1 Then '-1 means open... lol
                For Each selectedItems As Object In raw_data_open_folder_dialog.SelectedItems
                    sz_SelectedPath = selectedItems.ToString()
                Next
                TextBox_raw_data_dir.Text = sz_SelectedPath
            End If
        
            raw_app.Quit()
            ReleaseComObject(raw_app)
            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Sub
        
        ' Release excel objects to avoid memory leak
        Public Sub ReleaseComObject(ByRef obj As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
                MsgBox("Exception! Failed to release com obj, debug your code.")
            End Try
        End Sub
        

        如果你想要一个 C# 版本,我相信你足够聪明,可以将它移植到 C# :)

        【讨论】:

          【解决方案5】:

          请查看BetterFolderBrowser。它提供您所需要的以及更多。

          BetterFolderBrowser 是一个 .NET 组件库,旨在帮助开发人员通过使用与标准 OpenFileDialog 类似的浏览器对话框代替当前FolderBrowserDialog 仅允许使用其树视图显示格式选择单个文件夹。这允许使用标准的 Windows 资源管理器对话框更轻松地查看、修改、搜索和选择体验。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-02
            • 1970-01-01
            • 2010-11-18
            • 2012-10-29
            • 2018-02-12
            • 1970-01-01
            相关资源
            最近更新 更多