2011-04-20 2 views
6

.NET 4 WPF 응용 프로그램에서 WPF OpenFileDialog 및 SaveFileDialog를 사용하고 있습니다. 사용자가 다른 파일 필터를 설정할 수 있도록 Filter 속성을 사용합니다. .NET 4에서는 Windows Vista에서 도입 된 기본 파일 대화 상자 (가능한 경우)를 사용합니다.Vista/Windows 7의 확장 프로그램 숨기기 WPF FileDialog.Filter

그러나 이러한 대화 상자에는 파일 필터를 구성하는 확장이 표시됩니다. 이 중 일부는 꽤 많은 확장 기능을 사용하기 때문에 꽤 추한 것입니다.

예를 들어 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를 사용하여 코드가 어딘가에 있는지 확인하려고 노력했지만 매우 복잡하기 때문에 빨리 포기했습니다.

예를 들어 그림판을 시작하면 괄호 안에 내용이없는 파일 대화 상자를 사용할 수 있습니다 (예 : Image files).

누구든지이 "기능"에 대한 해결책을 알고 있습니까?

+1

. 사용중인 OpenFileDialog의 전체 네임 스페이스는 무엇입니까? –

+0

롤은 Windows 7에서 VS 2010에서이 기능을 시도했지만 지금은 동일한 기능을 제공합니다. –

+0

Microsoft.Win32.OpenFileFilter를 사용하고 있습니다. 자동으로 추가 된 필터 요소가 없습니다. 오히려 괄호 안의 내용이 자동으로 추가됩니다. –

답변

5

당신은 올바른 길을 가고 있습니다. 열린 파일 대화 상자를 표시하는 효과적인 방법은 두 가지입니다. 새로운 방법은 IFileOpenDialog (IFileDialog까지 확장)을 사용합니다. 이 방법을 사용하면 필터 설명과 파일 사양이 COMDLG_FILTERSPEC 구조를 사용하여 정의됩니다. 이것은 자신의 분야로 분리 된 것을 유지하는데, 그것은 더 자연입니다.

이 방법을 사용하여 콤보 상자에서 파일 사양을 제거하려면 사용자 지정 컨트롤을 추가하거나 대화 상자에서 콤보 상자 컨트롤을 조작해야합니다. 이것은 지저분해질 수 있지만, 할 수 있어야합니다.

구식 학교 방법은 GetOpenFileNameOPENFILENAME 구조를 사용합니다. 이 하나의 트릭은 이전 모습이나 새로운 모습으로 대화 상자를 표시 할 수 있습니까? 모양은 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 플래그를 추가하려고 할 수 있으며, 기존 디자인으로 돌아갑니다.그러나 위의 코드는 모든 파일에 파일 사양을 표시하지 않고 열린 파일 대화 상자를 표시합니다.

+0

고마워요. 나는 대부분의 사용자가 알아 채지 못할 사소한 개선을 위해 많은 작업을하게 될 것이므로이 작업을 건너 뛸 것이라고 생각합니다 ... –

1

많은 테스트를 거친 결과, 다음과 같은 결과가 나타납니다. WPF의 FileDialog는 필터로 정의 된대로 IFileDialog::SetFileTypes 네이티브 메서드를 호출합니다. Windows 탐색기 폴더 설정에서 알려진 파일 형식의 확장명을 숨기는 Windows 옵션에 따라 확장명이 자동으로 추가되거나 제거됩니다.

지금 남아있는 유일한 질문은 열린 파일 대화 상자에서 "그림 파일"의 확장명을 그림판에서 표시 할 수 없다는 것입니다.

1

당신은 여기에 머리를 할 수 있습니다 ... 나는 필터 요소가 자동으로 추가됩니다 동작을 본 적이

Hide Extensions