2011-04-20 14 views
6

में एक्सटेंशन छुपाएं मैं अपने .NET 4 WPF अनुप्रयोग में WPF OpenFileDialog और SaveFileDialog का उपयोग कर रहा हूं। मैं फ़िल्टर प्रॉपर्टी का उपयोग उपयोगकर्ता को अलग-अलग फ़ाइल फ़िल्टर सेट करने की अनुमति देता हूं। .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 प्रदर्शित करना चाहिए। लेकिन कहीं भी कोष्ठक में सामान जोड़ा जाता है। मैंने रिफ्लेक्टर के साथ कोड को देखने की कोशिश की ताकि यह देखने के लिए कि यह कहीं किया गया है, लेकिन जल्दी से छोड़ दिया गया है क्योंकि यह काफी संकलित है।

पेंट शुरू करना, उदाहरण के लिए, मैं देख सकता हूं कि इन फ़ाइल संवादों को ब्रांड्स में सामान के बिना उपयोग करना संभव है, यानी यह Image files दिखाता है।

क्या कोई इस "फीचर" के लिए कामकाज जानता है?

+1

मैं व्यवहार जहां फिल्टर तत्वों स्वचालित रूप से जुड़ जाते हैं कभी नहीं देखा। आप OpenFileDialog का पूरा नामस्थान क्या उपयोग कर रहे हैं? –

+0

lol ने इसे विंडोज 7 पर वीएस 2010 में अभी कोशिश की और अब मुझे वही मिल गया है ... –

+0

मैं माइक्रोसॉफ्ट.Win32.OpenFileFilter का उपयोग कर रहा हूँ। स्वचालित रूप से कोई फ़िल्टर तत्व नहीं जोड़े गए हैं। इसके बजाय, कोष्ठक में सामान स्वचालित रूप से जोड़ा जाता है। –

उत्तर

5

आप सही रास्ते पर हैं। खुले फ़ाइल संवाद को प्रदर्शित करने के प्रभावी तरीके 2 तरीके हैं। नई विधि IFileOpenDialog का उपयोग करती है (जो IFileDialog फैली हुई है)। इस विधि के साथ, फ़िल्टर विवरण और फ़ाइल विनिर्देशों को COMDLG_FILTERSPEC संरचना का उपयोग करके परिभाषित किया गया है। यह अलग-अलग क्षेत्रों में अलग रहता है, जो अधिक प्रकृति है।

यदि आप इस विधि का उपयोग कर कॉम्बो बॉक्स से फ़ाइल चश्मा को हटाना चाहते हैं, तो आपको या तो अपना कस्टम नियंत्रण जोड़ना होगा या संवाद पर कॉम्बो बॉक्स नियंत्रण में हेरफेर करना होगा। हालांकि यह गन्दा हो जाएगा, लेकिन करने योग्य होना चाहिए।

पुरानी स्कूल विधि GetOpenFileName और OPENFILENAME संरचना का उपयोग करती है। इस के साथ चाल, यह है कि पुराने देखो या नए रूप के साथ एक संवाद प्रदर्शित कर सकते हैं। यह दृश्य OPENFILENAME संरचना में सेटिंग्स द्वारा निर्धारित किया गया है, जैसा कि here वर्णित है।

WinForms OpenFileDialog के साथ समस्या यह है कि जब वे ऑटो अपग्रेड सक्षम नहीं करते हैं तो वे IFileOpenDialog का उपयोग करते हैं, और ऑटो अपग्रेड सक्षम नहीं होने पर पुराने ओपन के साथ GetOpenFileName का उपयोग करें।

डब्ल्यूपीएफ संस्करण आपको कोई विकल्प नहीं देता है, लेकिन फिर भी WinForms के रूप में एक ही तर्क का उपयोग करता है, लेकिन यह स्वचालित रूप से आवश्यकतानुसार करता है। यह .NET 4 में WPF के लिए सच है, पिछले संस्करणों में यह पुराने रूप से GetOpenFileName का उपयोग करेगा।

पेंट नए रूप के साथ GetOpenFileName का उपयोग करने की संभावना है। यहाँ एक सी # उदाहरण है:

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 विधि को कॉल करता है। ज्ञात फ़ाइल प्रकारों (विंडोज एक्सप्लोरर फ़ोल्डर सेटिंग्स में) पर एक्सटेंशन को छिपाने के लिए विंडोज विकल्प के आधार पर, एक्सटेंशन स्वचालित रूप से जोड़े जाते हैं या नहीं।

अब एकमात्र सवाल यह है कि कैसे पेंट अपने छवि फ़ाइल संवाद में "छवि फ़ाइलों" के लिए एक्सटेंशन नहीं दिखा सकता है।