- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的 .NET 4 WPF 应用程序中使用 WPF OpenFileDialog 和 SaveFileDialog。我使用 Filter 属性来允许用户设置不同的文件过滤器。在 .NET 4 中,这使用 Windows Vista 引入的 native 文件对话框(如果可能)。
但是,这些对话框显示构成文件过滤器的扩展名。由于其中一些使用了相当多的扩展,这非常难看。
例如,我有一个过滤器 Image files|*.bmp;*.dib;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif;*.tif;*。 tiff;*.png;*.ico|所有文件|*.*
,显示为图像文件(*.bmp;*.dib;*.jpg;*.jpeg;*.jpe ;*.jfif;*.gif;*.tif;*.tiff;*.png;*.ico)
在对话框中。括号中的所有内容都是自动添加的,即根据 Filter 字符串,它应该显示 Image files
。但是在某处添加了括号中的内容。我试着用 Reflector 查看代码,看看它是否在某处完成,但很快就放弃了,因为它非常复杂。
例如,启动 Paint,我可以看到可以使用这些没有括号中内容的文件对话框,即它显示 Image files
。
有人知道这个“功能”的解决方法吗?
最佳答案
您走在正确的轨道上。有两种方法可以有效地显示打开的文件对话框。较新的方法使用 IFileOpenDialog (扩展 IFileDialog )。使用此方法,过滤器描述和文件规范是使用 COMDLG_FILTERSPEC 定义的结构。这样可以让分离的人各司其职,更加自然。
如果您想使用此方法从组合框中删除文件规范,则必须添加您自己的自定义控件或在对话框中操作组合框控件。虽然这会变得困惑,但应该是可行的。
老派方法使用GetOpenFileName和 OPENFILENAME结构。这个的诀窍在于可以显示具有旧外观或新外观的对话框。外观由 OPENFILENAME 结构中的设置决定,如所述 here .
WinForms OpenFileDialog 的问题在于,当 AutoUpgradeEnabled 为真时,它们要么使用 IFileOpenDialog,而当 AutoUpgradeEnabled 为假时,它们使用旧外观的 GetOpenFileName。
WPF 版本不提供选择,但仍使用与 WinForms 相同的逻辑,但会根据需要自动执行。这对于 .NET 4 中的 WPF 是正确的,在以前的版本中它只会使用具有旧外观的 GetOpenFileName。
Paint 很可能使用具有新外观的 GetOpenFileName。这是一个 C# 示例:
private delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private const int OFN_ALLOWMULTISELECT = 0x00000200;
private const int OFN_CREATEPROMPT = 0x00002000;
private const int OFN_DONTADDTORECENT = 0x02000000;
private const int OFN_ENABLEHOOK = 0x00000020;
private const int OFN_ENABLEINCLUDENOTIFY = 0x00400000;
private const int OFN_ENABLESIZING = 0x00800000;
private const int OFN_ENABLETEMPLATE = 0x00000040;
private const int OFN_ENABLETEMPLATEHANDLE = 0x00000080;
private const int OFN_EXPLORER = 0x00080000;
private const int OFN_EXTENSIONDIFFERENT = 0x00000400;
private const int OFN_FILEMUSTEXIST = 0x00001000;
private const int OFN_FORCESHOWHIDDEN = 0x10000000;
private const int OFN_HIDEREADONLY = 0x00000004;
private const int OFN_LONGNAMES = 0x00200000;
private const int OFN_NOCHANGEDIR = 0x00000008;
private const int OFN_NODEREFERENCELINKS = 0x00100000;
private const int OFN_NOLONGNAMES = 0x00040000;
private const int OFN_NONETWORKBUTTON = 0x00020000;
private const int OFN_NOREADONLYRETURN = 0x00008000;
private const int OFN_NOTESTFILECREATE = 0x00010000;
private const int OFN_NOVALIDATE = 0x00000100;
private const int OFN_OVERWRITEPROMPT = 0x00000002;
private const int OFN_PATHMUSTEXIST = 0x00000800;
private const int OFN_READONLY = 0x00000001;
private const int OFN_SHAREAWARE = 0x00004000;
private const int OFN_SHOWHELP = 0x00000010;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class OPENFILENAME_I {
public int lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
public string lpstrFilter;
public IntPtr lpstrCustomFilter;
public int nMaxCustFilter;
public int nFilterIndex;
public IntPtr lpstrFile;
public int nMaxFile = 260;
public IntPtr lpstrFileTitle;
public int nMaxFileTitle = 260;
public string lpstrInitialDir;
public string lpstrTitle;
public int Flags;
public short nFileOffset;
public short nFileExtension;
public string lpstrDefExt;
public IntPtr lCustData;
public WndProc lpfnHook;
public string lpTemplateName;
public IntPtr pvReserved;
public int dwReserved;
public int FlagsEx;
}
[DllImport("comdlg32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool GetOpenFileName([In, Out] OPENFILENAME_I ofn);
private void ShowOpenFileDialog() {
OPENFILENAME_I ofn = new OPENFILENAME_I();
ofn.lStructSize = Marshal.SizeOf(typeof(OPENFILENAME_I));
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files\0*.*\0\0";
ofn.nFilterIndex = 0;
//ofn.Flags = OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING | OFN_NODEREFERENCELINKS | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.Flags = OFN_ENABLESIZING | OFN_NODEREFERENCELINKS | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
GetOpenFileName(ofn);
}
您可以尝试重新添加 OFN_EXPLORER
和/或 OFN_ENABLEHOOK
标志,它会恢复到旧外观。但照原样,上面的代码将显示一个打开的文件对话框,其中所有文件不显示其文件规范。
关于wpf - 在 Vista/Windows 7 WPF FileDialog.Filter 中隐藏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13803139/
我正在 Access 数据库中制作表单我需要多次打开文件对话框窗口。我只是不明白为什么在我更改了几次选项值并打开文件对话框窗口后它没有更改过滤器。 Public Sub Command17_Click
我正在使用 Java 开发一个 socket 程序。我在后台运行带有套接字服务器的GUI。套接字服务器正在运行一个线程,每 10 毫秒检查一次套接字消息。它们都运行良好,但是当我尝试在 gui 中打开
我使用以下代码遇到了奇怪的行为: FileDialog openFileDialog1; // ... openFileDialog1.CustomPlaces.Add(@"C:\whatever\"
谁能给我解释一下为什么FileDialog实现两个构造函数,一个用于 Frame,一个用于 Dialog?我的意思是,他们为什么不利用继承的好处而只是使用 Window 创建一个构造函数? ?我问这个
我有一个使用 FileDialog 浏览文件的按钮。我需要读取我选择的文件中的所有行,我尝试了很多方法,但对我没有任何作用:( 我有另一个按钮,当我按下它时,它会读取文件并打印它。 B
我想显示一个 Java FileDialog 并将其初始大小设置为合理的值(它不显示最大化按钮,很多用户可能不知道可以使用 alt-space X 代替)。我尝试了 setBounds 但它没有做任何
在开发WinForms应用程序时,我遇到了OpenFileDialog和SaveFileDialog控件中的一个错误。 Google搜索发现只有一个发现相同问题的其他人,但是没有提供解决方案或解决方法
我在 StackOverflow 上找到了这段代码: Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDi
您好,我正在尝试从设置路径中基于 FileDialog 的文件夹导入文本文件?我有一个导入文本文件的代码,但它只打开一个通用的 C:\\ 路径,我应该如何修改下面的代码才能打开指定路径的文件夹? Su
我试图在 QtQuick 中为 FileDialog 设置默认起始目录,但它不起作用(意味着它总是打开可执行文件的目录): property url defPath : "/home/saeid/Wo
我正在创建一个基于 SWT 的应用程序。我有一个名为“Import”的按钮,单击此按钮将打开一个 swt FileDialog 来选择文件。当此文件对话框打开时,我有一个独特的要求,我只想显示特定文件
我试图在 QtQuick 中为 FileDialog 设置默认起始目录,但它不起作用(意味着它总是打开可执行文件的目录): property url defPath : "/home/saeid/Wo
我需要打开一个 FileDialog,以便在使用 Java 7 的 Windows 7 Home 上使用 SWT 打开文件。我需要在按下 BrowseBtn1 按钮 (SWT) 时打开此 FileDi
我可以使用 JFileChooser 给出文件扩展名。示例: JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter fi
当我想在从控制台获得一些输入后打开文件对话框时,它失败了。请参阅下面的代码。当我第一次调用 openFileDialog 然后 chooseOption 时,它工作正常。有人知道这是怎么可能的吗? p
我确信这些都是非常白痴的问题...但我以前从未处理过 FileDialog,而且我似乎无法让我的编码工作。 这是我的 JButton 监听器,我知道它进入是因为弹出了一个 FileDialog: pu
如果我有这样的过滤器字符串(FileDialog 的过滤器): "Image Files (*.bmp, *.jpg)|*.bmp;*.jpg|All Files (*.*)|*.*" C# 中是否有
JMenuBar menubar = new JMenuBar(); JMenu file = new JMenu("File"); add(menubar,BorderLayout.NORTH);
我会将 FileDialog 组件本地化为英语。我的默认语言是意大利语。可能吗? 我使用 FileDialog 的项目是一个 Eclipse 插件项目。 我找到了仅适用于 JFileChooser 组
当窗口对话框打开时,我无法选择多个文件。 void setup() { size(100,100); select_multi_files_via_FileDialog(); } import
我是一名优秀的程序员,十分优秀!