我希望用户选择一个目录,然后保存我将生成的文件.我知道在WPF中我应该使用OpenFileDialog来自Win32,但不幸的是,对话框需要选择文件 - 如果我只是单击"确定"而不选择一个文件,它将保持打开状态.我可以通过让用户选择一个文件然后去除路径以找出它所属的目录来"破解"该功能,但这最多是不直观的.以前有人见过这个吗?
在VS .NET中,当您为项目选择文件夹时,会显示一个看起来像OpenFileDialog或SaveFileDialog的对话框,但设置为仅接受文件夹.自从我看到这个以来,我就想知道它是如何完成的.我知道FolderBrowserDialog,但我从来没有真正喜欢那个对话框.它开始太小,不让我利用能够键入路径.
我几乎可以肯定,现在没有办法从.NET做到这一点,但我也很好奇你是如何从非托管代码中做到这一点的.如果没有从头开始完全重新实现对话框,那么如何修改对话框以获得此行为?
我还要重申,我知道FolderBrowserDialog,但有时我不喜欢使用它,除了真正好奇如何以这种方式配置对话框.告诉我只使用FolderBrowserDialog可以帮助我保持一致的UI体验,但不能满足我的好奇心,所以它不会算作答案.
它也不是特定于Vista的东西; 自从VS .NET 2003以来我一直在看这个对话框,所以在Win2k和WinXP中它是可行的.这不是一个"我想知道正确的方法来做这个"的问题,更多的是"我一直很好奇这个,因为我第一次想在VS 2003中这样做"的问题.我知道Vista的文件对话框有一个选项可以做到这一点,但它一直在XP中工作,所以我知道他们做了一些事情让它工作.特定于Vista的答案不是答案,因为问题上下文中不存在Vista.
更新:我接受了Scott Wisniewski的答案,因为它附带了一个工作样本,但我认为Serge指出对话框定制(这无疑是.NET令人讨厌但它确实有效)和Mark Ransom弄清楚MS 是值得称赞的.可能为此任务滚动了一个自定义对话框.
我开发了一个WPF4应用程序,在我的应用程序中,我需要让用户选择一个应用程序将存储内容的文件夹(文件,生成的报告等).
我的要求:
能够查看标准文件夹树
能够选择文件夹
WPF的外观和感觉,此对话框必须看起来像是为Windows Vista/7而不是Windows 2000甚至Win9x设计的现代应用程序的一部分.
据我所知,到2010年(.Net 4.0)将没有标准的文件夹对话框,但是版本4.0可能有一些变化?
或者剩下要做的就是使用老式的WinForms对话框?如果这是我需要的唯一方法,我怎样才能让它更接近Vista/7风格而不是Win9x呢?
在某些论坛上,我看到了这种对话框的实现,但是在Windows 95中看到了丑陋的旧图标.它看起来并不好看.
有谁知道自定义System.Windows.Forms.FolderBrowserDialog的最简单方法是什么,因此可以使用树下方文本框中的文本输入路径.
我想要这样,所以很容易选择未映射的UNC路径.
看起来这个KB有一些支持信息.
我发布了 - 如何使用OpenFileDialog选择文件夹?,我找不到正确的答案.所以,我改变了我的问题.
我想自定义OpenFileDialog以选择多个文件夹和文件.我试图找到一个解决方案,可以看到一些关于它的帖子.
从互联网上,我找到了以下项目 - https://github.com/scottwis/OpenFileOrFolderDialog.
然而,在使用它时,我遇到了一个问题.它使用MFC中的GetOpenFileName函数和OPENFILENAME结构.和OPENFILENAME有一个名为"成员templateID ".它是对话框模板的标识符.并且示例项目具有" res1.rc "文件,并且还具有模板化对话框.
但我不知道如何将此文件附加到我的C#项目中?
还是有任何其他完美的解决方案 - " 如何自定义OpenFileDialog以选择多个文件夹和文件? "?
我一直在研究Windows窗体应用程序,并且最近添加了一个简单的设置页面,允许用户选择输出所在的文件夹.OpenFileDialog是丑陋的,不好用,所以我已经在Windows API CodePack中添加了访问CommonOpenFileDialog-所有好处.
当我打开CommonOpenFileDialog时,Windows窗体应用程序缩小到较小的大小,如附加的图像所示.
左边是程序,右边是打开的对话框:
我之前和之后都试过检查表格的大小,这没有改变,所以我打了一个砖墙.任何信息都是有用的,如果需要我可以提供更多细节.
打开表单的代码是:
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.DefaultDirectory = selectedFolderTextBox.Text;
dialog.IsFolderPicker = true;
if (dialog.ShowDialog() != CommonFileDialogResult.Ok) return;
selectedFolderTextBox.Text = dialog.FileName;
Run Code Online (Sandbox Code Playgroud) 我第一次在WPF中实现FolderBrowserDialog并且我不喜欢它...
除了我已经弄清楚我的项目中没有引用Windows.Forms的问题,现在我在查看DialogResult返回值是什么时遇到了麻烦......
使用OpenFileDialog,过去我已经这样做了:
OpenFileDialog ofd = new OpenFileDialog();
Nullable<bool> result = ofd.ShowDialog();
if (result == true)
{
// all went well, carry on and do your thing here
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我现在得到的错误是关于从DialogResult类型转换为bool以及任何有你的转换.
在WPF中使用对话框似乎无法找到关于如何完成此步骤的任何内容,任何人都可以解决一些问题吗?
提前致谢!
编辑
这是我的代码修改后没有类型转换错误.我不确定要检查什么价值result.通常我会使用,DialogResult.OK除了在这里没有显示为有效值.
private void btnBrowse_Click(object sender, RoutedEventArgs e)
{
if (cmbTemplate.SelectedItem == "Blockbusters")
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
DialogResult result = fbd.ShowDialog();
//
// ERROR: 'System.Nullable<bool>' does not contain a definition for 'OK'
// and no extention method 'OK' accepting a first argument …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 CommonOpenFileDialog 的文件夹选择器,如本答案中所述。问题是,即使有一个非常精简的示例项目,我在尝试使用 CommonOpenFileDialog 的函数时也会遇到异常ShowDialog()。
using Microsoft.WindowsAPICodePack.Dialogs;
namespace DialogTest
{
class Program
{
public static void Main(string[] args)
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
CommonFileDialogResult result = dialog.ShowDialog();
if (result == CommonFileDialogResult.Ok)
{
//Do Stuff
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还与作者 Microsoft 一起使用以下 nuget 包:
此代码在 处产生以下异常dialog.ShowDialog();:
System.Runtime.InteropServices.COMException was unhandled
ErrorCode=-2147023116
HResult=-2147023116
Message=A null reference pointer was passed to the stub. (Exception from HRESULT: …Run Code Online (Sandbox Code Playgroud) Using .Net 4.0 / WPF Application / C#
I have the following piece of code in my application, which opens a FileDialog when the Select button is clicked.
OpenFileDialog fdgSelectFile;
bool? dialogResult;
try
{
fdgSelectFile = new OpenFileDialog {DefaultExt = FileDialogDefaultExt, Filter = FileDialogFilter};
dialogResult = fdgSelectFile.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
SelectedFilePath = fdgSelectFile.FileName;
// do your stuff
}
}
Run Code Online (Sandbox Code Playgroud)
This piece of code works in other machines, but not in my machine. It just throws an exception - …
我想保存文件应该保存的路径,但我不希望用户添加文件的名称及其格式.只需选择应保存文件的地图.
下面的代码不能保存路径,因为您还需要添加文件名.
SaveFileDialog saveFileDialog = new SaveFileDialog();
if (saveFileDialog.ShowDialog() == true)
{
lblDestination.Content = saveFileDialog.FileName;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!