文件夹浏览器对话框类似于打开文件对话框。

20
请查看下面的快照。这是从Visual Studio 2008的“新项目创建”工作流程中获取的。
此窗口用于选择存储项目的文件夹。我如何在我的C#应用程序中创建类似的窗口?

enter image description here


1
查看这个问题。基本上,他们似乎子类化了标准的文件打开对话框。 - Uwe Keim
@UweKeim:那个问题线程中解释了子类化在哪里?他回答说他最终使用了VistaBridge。 - Rockstart
1
前段时间我下载了VistaBride并研究了他们的源代码。如果我没记错的话,它是通过子类化标准文件打开对话框实现的。 - Uwe Keim
+1 分钟,因为你提出的问题得到了你所要求的确切解决方案。 - Alex Essilfie
作为解决方案,我使用了SaveFileDialog并插入了零宽空格符号作为文件名。然后我只需使用Path.GetFullPath剥离路径即可。 - Hi-Angel
注意:以上代码实现方法很粗糙,因为它仍然会提示用户输入文件名和扩展名。 - stigzler
5个回答

6

这类功能在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对象库)的引用。

3

2
如果您可以添加NuGet包,Microsoft.WindowsAPICodePack.Shell中有一个CommonOpenFileDialog,可以在“文件夹模式”下使用,这应该符合您的预期用途。
var directoryDialog = new CommonOpenFileDialog
  {
     IsFolderPicker = true,
     Title = "Select Folder"
  };

0

我将代码从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# :)

0

请查看BetterFolderBrowser。它提供了您所需的一切,还有更多。

BetterFolderBrowser是一个.NET组件库,旨在帮助开发人员通过使用类似于标准OpenFileDialog的浏览器对话框来代替当前的FolderBrowserDialog,从而为用户提供更好的文件夹浏览和选择体验。后者只允许使用树形视图显示格式进行单个文件夹选择。这使得使用标准Windows资源管理器对话框进行查看、修改、搜索和选择体验更加轻松。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接