热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:打开目录对话框

篇首语:本文由编程笔记#小编为大家整理,主要介绍了打开目录对话框相关的知识,希望对你有一定的参考价值。我希望

篇首语:本文由编程笔记#小编为大家整理,主要介绍了打开目录对话框相关的知识,希望对你有一定的参考价值。



我希望用户选择一个目录,然后保存我将生成的文件。我知道在WPF中我应该使用Win32中的OpenFileDialog,但不幸的是对话框需要选择文件 - 如果我只是单击OK而不选择一个文件,它将保持打开状态。我可以通过让用户选择一个文件然后去除路径以找出它所属的目录来“破解”这个功能,但最好不直观。有没有人见过这个呢?


答案

您可以使用内置的FolderBrowserDialog类。不要介意它在System.Windows.Forms名称空间中。

using (var dialog = new System.Windows.Forms.FolderBrowserDialog())
{
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
}

如果您希望窗口在某个WPF窗口上是模态的,请参阅问题How to use a FolderBrowserDialog from a WPF application。



编辑:如果你想要一些比简单,丑陋的Windows窗体FolderBrowserDialog更有趣的东西,有一些替代方案,允许您使用Vista对话框:



  • 第三方库,例如Ookii dialogs(.NET 3.5)

  • Windows API Code Pack-Shell:
    using Microsoft.WindowsAPICodePack.Dialogs;
    ...
    var dialog = new CommonOpenFileDialog();
    dialog.IsFolderPicker = true;
    CommonFileDialogResult result = dialog.ShowDialog();

    请注意,此对话框在Windows Vista之前的操作系统上不可用,因此请务必先检查CommonFileDialog.IsPlatformSupported


另一答案

The Ookii VistaFolderBrowserDialog is the one you want.

如果你只想要来自Ooki Dialogs的文件夹浏览器而不是download the Source,请选择文件夹浏览器所需的文件(提示:7个文件),并在.NET 4.5.2中构建它。我不得不添加对System.Drawing的引用。将原始项目中的引用与您的引用进行比较。

你怎么弄清楚哪些文件?在不同的Visual Studio实例中打开您的应用程序和Ookii。将VistaFolderBrowserDialog.cs添加到您的应用程序并继续添加文件,直到构建错误消失。您可以在Ookii项目中找到依赖项 - 控制 - 单击要跟踪其源(双关语)的依赖项。

如果你太懒,那么你需要的文件......

NativeMethods.cs
SafeHandles.cs
VistaFolderBrowserDialog.cs
Interop
COMGuids.cs
ErrorHelper.cs
ShellComInterfaces.cs
ShellWrapperDefinitions.cs

VistaFolderBrowserDialog.cs编辑第197行,除非你想包括他们的Resources.Resx

抛出新的InvalidOperationException(Properties.Resources.FolderBrowserDialogNoRootFolder);

throw new InvalidOperationException("Unable to retrieve the root folder.");

根据他们的license.txt将他们的版权声明添加到您的应用中

Ookii.Dialogs.Wpf.SampleMainWindow.xaml.cs第160-169行中的代码是您可以使用的示例,但您需要从this,中删除MessageBox.Show(this,以获取WPF。

适用于我的机器[TM]


另一答案

我知道这是一个老问题,但一个简单的方法是使用WPF提供的FileDialog选项并使用System.IO.Path.GetDirectory(filename)。


另一答案

这些答案都不适用于我(通常有一个缺失的参考或类似的东西)

但这很简单:

Using FolderBrowserDialog in WPF application

添加对System.Windows.Forms的引用并使用以下代码:

var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();

无需追踪丢失的包裹。或者添加大量的课程

这给了我一个现代文件夹选择器,它还允许您创建一个新文件夹

我还没有看到部署到其他机器时的影响


另一答案

你可以在WPF中使用像这样的smth。我已经创建了示例方法。检查下面。

public string getFolderPath()
{
// Create OpenFileDialog
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (openFileDialog.ShowDialog() == true)
{
System.IO.FileInfo fInfo = new System.IO.FileInfo(openFileDialog.FileName);
return fInfo.DirectoryName;
}
return null;
}

另一答案

我创建了一个UserControl,使用如下:


xaml源代码如下:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">


Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />


和代码隐藏

public partial class FolderEntry {
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty DescriptiOnProperty= DependencyProperty.Register("Description", typeof(string), typeof(FolderEntry), new PropertyMetadata(null));
public string Text { get { return GetValue(TextProperty) as string; } set { SetValue(TextProperty, value); }}
public string Description { get { return GetValue(DescriptionProperty) as string; } set { SetValue(DescriptionProperty, value); } }
public FolderEntry() { InitializeComponent(); }
private void BrowseFolder(object sender, RoutedEventArgs e) {
using (FolderBrowserDialog dlg = new FolderBrowserDialog()) {
dlg.Description = Description;
dlg.SelectedPath = Text;
dlg.ShowNewFolderButton = true;
DialogResult result = dlg.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK) {
Text = dlg.SelectedPath;
BindingExpression be = GetBindingExpression(TextProperty);
if (be != null)
be.UpdateSource();
}
}
}
}

另一答案

我正在使用Ookii dialogs一段时间,它对WPF很有用。

这是直接页面:

http://www.ookii.org/Blog/new_download_ookiidialogs


另一答案

对于那些不想创建自定义对话框但仍然喜欢100%WPF方式并且不想使用单独的DDL,其他依赖项或过时的API的人,我想出了一个非常简单的黑客使用“另存为”对话框。

不需要使用指令,您可以简单地复制粘贴下面的代码!

它应该仍然是非常用户友好的,大多数人永远不会注意到。

这个想法来自于我们可以更改对话框的标题,隐藏文件以及轻松处理生成的文件名。

这肯定是一个很大的黑客,但也许它可以很好地满足你的使用......

在这个例子中,我有一个文本框对象来包含结果路径,但如果你愿意,你可以删除相关的行并使用返回值...

// Create a "Save As" dialog for selecting a directory (HACK)
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.InitialDirectory = textbox.Text; // Use current value for initial dir
dialog.Title = "Select a Directory"; // instead of default "Save As"
dialog.Filter = "Directory|*.this.directory"; // Prevents displaying files
dialog.FileName = "select"; // Filename will then be "select.this.directory"
if (dialog.ShowDialog() == true) {
string path = dialog.FileName;
// Remove fake filename from resulting path
path = path.Replace("\select.this.directory", "");
path = path.Replace(".this.directory", "");
// If user has changed the filename, create the new directory
if (!System.IO.Directory.Exists(path)) {
System.IO.Directory.CreateDirectory(path);
}
// Our final value is in path
textbox.Text = path;
}

这个黑客的唯一问题是:



  • 确认按钮仍然显示“保存”而不是“选择目录”之类的东西,但在像矿井的情况下,我“保存”目录选择,所以它仍然有效...

  • 输入字段仍然显示“文件名”而不是“目录名”,但我们可以说目录是一种文件...

  • 仍然有一个“保存
推荐阅读
  • Ubuntu 22.04 安装搜狗输入法详细指南及常见问题解决方案
    本文将详细介绍如何在 Ubuntu 22.04 上安装搜狗输入法,并提供常见问题的解决方法。包括下载安装包、更新源、安装依赖项等步骤。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • WCF类型共享的最佳实践
    在使用WCF服务时,经常会遇到同一个实体类型在不同服务中被生成为不同版本的问题。本文将介绍几种有效的类型共享方法,以解决这一常见问题。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
author-avatar
米米清澈_109
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有