我希望用户选择一个目录,我将生成的文件将保存在其中。我知道在WPF中,我应该使用Win32中的OpenFileDialog,但不幸的是,对话框需要选择文件-如果我只是单击确定而不选择一个,它就会保持打开。我可以通过让用户选择一个文件,然后剥离路径以找出它属于哪个目录来“hack”该功能,但这充其量是不直观的。有人见过这种情况吗?


当前回答

对于目录对话框获取目录路径,首先添加引用System.Windows。表单,然后解析,然后把这个代码放在按钮点击。

    var dialog = new FolderBrowserDialog();
    dialog.ShowDialog();
    folderpathTB.Text = dialog.SelectedPath;

(folderpathTB是文本框的名字,我想把文件夹路径,或者你可以把它分配给一个字符串变量也就是)

    string folder = dialog.SelectedPath;

如果你想获得文件名/路径,只需在按钮单击上这样做

    FileDialog fileDialog = new OpenFileDialog();
    fileDialog.ShowDialog();
    folderpathTB.Text = fileDialog.FileName;

(folderpathTB是文本框的名字,我想把文件路径,或者你可以把它分配给一个字符串变量太)

注意:对于文件夹对话框,必须将System.Windows.Forms.dll添加到项目中,否则它将无法工作。

其他回答

正如前面的回答中所述,FolderBrowserDialog是为此使用的类。有些人(有理由)担心这个对话框的外观和行为。好消息是它在NET Core 3.0中被“现代化”了,所以现在对于那些针对该版本或更高版本编写Windows窗体或WPF应用程序的人来说是一个可行的选择(如果你仍然使用NET Framework,那就不走运了)。

在。net Core 3.0中,Windows窗体用户[原文如此]在Windows Vista中引入了一个新的基于com的控件:

要在NET Core WPF应用程序中引用System.Windows.Forms,必须编辑项目文件并添加以下行:

<UseWindowsForms>true</UseWindowsForms>

它可以直接放在现有的<UseWPF>元素之后。

然后就是使用对话框的例子:

using System;
using System.Windows.Forms;

...

using var dialog = new FolderBrowserDialog
{
    Description = "Time to select a folder",
    UseDescriptionForTitle = true,
    SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
        + Path.DirectorySeparatorChar,
    ShowNewFolderButton = true
};

if (dialog.ShowDialog() == DialogResult.OK)
{
    ...
}

FolderBrowserDialog有一个RootFolder属性,据说“设置浏览开始的根文件夹”,但无论我设置这个没有任何区别;SelectedPath似乎是更好的属性,但是后面的反斜杠是必需的。

此外,ShowNewFolderButton属性似乎也被忽略了,按钮总是显示不管。

对于目录对话框获取目录路径,首先添加引用System.Windows。表单,然后解析,然后把这个代码放在按钮点击。

    var dialog = new FolderBrowserDialog();
    dialog.ShowDialog();
    folderpathTB.Text = dialog.SelectedPath;

(folderpathTB是文本框的名字,我想把文件夹路径,或者你可以把它分配给一个字符串变量也就是)

    string folder = dialog.SelectedPath;

如果你想获得文件名/路径,只需在按钮单击上这样做

    FileDialog fileDialog = new OpenFileDialog();
    fileDialog.ShowDialog();
    folderpathTB.Text = fileDialog.FileName;

(folderpathTB是文本框的名字,我想把文件路径,或者你可以把它分配给一个字符串变量太)

注意:对于文件夹对话框,必须将System.Windows.Forms.dll添加到项目中,否则它将无法工作。

看来微软。Win32 . net库不支持选择文件夹(只支持文件),所以你在WPF中运气不好(截至2022年7月)。我觉得现在最好的选择是WPF的Ookii: https://github.com/ookii-dialogs/ookii-dialogs-wpf。它工作得很好,正如预期的那样,在WPF减去微软的支持。你可以把它作为NuGet包来获取。XAML视图背后的代码:

public partial class ExportRegionView : UserControl
{
    public ExportRegionView()
    {
        InitializeComponent();
    }
    private void SavePath(object sender, RoutedEventArgs e)
    {
        var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
        dialog.Description = "SIPAS Export Folder";
        dialog.UseDescriptionForTitle = true;
        if (dialog.ShowDialog().GetValueOrDefault())
        {
            ExportPath.Text = dialog.SelectedPath;
        }
    }
}

XAML: <Button Grid.Row="1" Grid.Column="3" Style="{DynamicResource Esri_Button}" Click="SavePath" Margin="5,5,5,5">Path</Button>

Ookii对话框包括一个选择文件夹(而不是文件)的对话框:

https://github.com/ookii-dialogs

我建议,在黄金套餐中加入:

  Install-Package OpenDialog

那么使用它的方法是:

    Gat.Controls.OpenDialogView openDialog = new Gat.Controls.OpenDialogView();
    Gat.Controls.OpenDialogViewModel vm = (Gat.Controls.OpenDialogViewModel)openDialog.DataContext;
    vm.IsDirectoryChooser = true;
    vm.Show();

    WPFLabel.Text = vm.SelectedFilePath.ToString();

以下是文档: http://opendialog.codeplex.com/documentation

适用于文件,文件过滤器,文件夹等