gpt4 book ai didi

wpf - 在 Vista/Windows 7 WPF FileDialog.Filter 中隐藏扩展

转载 作者:行者123 更新时间:2023-12-04 11:59:50 26 4
gpt4 key购买 nike

我在我的 .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|All files|*.* ,显示为 Image files (*.bmp;*.dib;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif;*.tif;*.tiff;*.png;*.ico)在对话框中。括号中的所有内容都会自动添加,即根据过滤器字符串,它应该显示 Image files .但是在某处添加了括号中的内容。我试着用 Reflector 查看代码,看看它是否在某处完成,但很快就放弃了,因为它非常复杂。

例如,启动 Paint,我可以看到可以使用这些文件对话框而没有括号中的内容,即它显示 Image files .

有谁知道这个“功能”的解决方法?

最佳答案

你在正确的轨道上。有两种有效的方式来显示打开的文件对话框。较新的方法使用 IFileOpenDialog (扩展 IFileDialog )。使用此方法,使用 COMDLG_FILTERSPEC 定义过滤器描述和文件规范。结构体。这使分离的人进入自己的领域,这更自然。

如果要使用此方法从组合框中删除文件规范,则必须添加自己的自定义控件或操作对话框中的组合框控件。虽然这会变得困惑,但应该是可行的。

老派方法使用 GetOpenFileNameOPENFILENAME结构体。这个技巧是可以显示一个带有旧外观或新外观的对话框。外观由 OPENFILENAME 结构中的设置决定,如 here 所述。 .

WinForms OpenFileDialog 的问题在于,它们要么在 AutoUpgradeEnabled 为 true 时使用 IFileOpenDialog,要么在 AutoUpgradeEnabled 为 false 时使用旧外观的 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/5732907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com