我希望用户选择一个目录,我将生成的文件将保存在其中。我知道在WPF中,我应该使用Win32中的OpenFileDialog,但不幸的是,对话框需要选择文件-如果我只是单击确定而不选择一个,它就会保持打开。我可以通过让用户选择一个文件,然后剥离路径以找出它属于哪个目录来“hack”该功能,但这充其量是不直观的。有人见过这种情况吗?
当前回答
这些答案都不适合我(通常是缺少参考资料或类似的东西)
但这很简单:
在WPF应用程序中使用FolderBrowserDialog
添加一个对System.Windows.Forms的引用,并使用以下代码:
var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
没有必要去寻找丢失的包裹。或者添加大量的类
这为我提供了一个现代化的文件夹选择器,还允许您创建一个新文件夹
我还没有看到部署到其他机器上的影响
其他回答
看来微软。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>
正如前面的回答中所述,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属性似乎也被忽略了,按钮总是显示不管。
我建议,在黄金套餐中加入:
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
适用于文件,文件过滤器,文件夹等
我知道这是一个老问题,但一个简单的方法是使用WPF提供的FileDialog选项,并使用System.IO.Path.GetDirectory(filename)。
这些答案都不适合我(通常是缺少参考资料或类似的东西)
但这很简单:
在WPF应用程序中使用FolderBrowserDialog
添加一个对System.Windows.Forms的引用,并使用以下代码:
var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
没有必要去寻找丢失的包裹。或者添加大量的类
这为我提供了一个现代化的文件夹选择器,还允许您创建一个新文件夹
我还没有看到部署到其他机器上的影响