당신은 올바른 길을 가고 있습니다. 열린 파일 대화 상자를 표시하는 효과적인 방법은 두 가지입니다. 새로운 방법은 IFileOpenDialog (IFileDialog까지 확장)을 사용합니다. 이 방법을 사용하면 필터 설명과 파일 사양이 COMDLG_FILTERSPEC 구조를 사용하여 정의됩니다. 이것은 자신의 분야로 분리 된 것을 유지하는데, 그것은 더 자연입니다.
이 방법을 사용하여 콤보 상자에서 파일 사양을 제거하려면 사용자 지정 컨트롤을 추가하거나 대화 상자에서 콤보 상자 컨트롤을 조작해야합니다. 이것은 지저분해질 수 있지만, 할 수 있어야합니다.
구식 학교 방법은 GetOpenFileName 및 OPENFILENAME 구조를 사용합니다. 이 하나의 트릭은 이전 모습이나 새로운 모습으로 대화 상자를 표시 할 수 있습니까? 모양은 here과 같이 OPENFILENAME 구조의 설정에 의해 결정됩니다.
WinForms OpenFileDialog의 문제는 AutoUpgradeEnabled가 true 일 때 IFileOpenDialog를 사용하고 AutoUpgradeEnabled가 false 일 때 이전 모양의 GetOpenFileName을 사용한다는 것입니다.
WPF 버전은 선택의 여지가 없지만 WinForms와 동일한 로직을 사용하지만 필요에 따라 자동으로 사용합니다. .NET 4의 WPF에서는 이전 버전에서 이전 모양의 GetOpenFileName 만 사용합니다.
페인트는 새로운 모양의 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
플래그를 추가하려고 할 수 있으며, 기존 디자인으로 돌아갑니다.그러나 위의 코드는 모든 파일에 파일 사양을 표시하지 않고 열린 파일 대화 상자를 표시합니다.
. 사용중인 OpenFileDialog의 전체 네임 스페이스는 무엇입니까? –
롤은 Windows 7에서 VS 2010에서이 기능을 시도했지만 지금은 동일한 기능을 제공합니다. –
Microsoft.Win32.OpenFileFilter를 사용하고 있습니다. 자동으로 추가 된 필터 요소가 없습니다. 오히려 괄호 안의 내용이 자동으로 추가됩니다. –