WPF

2011-04-14 10 views
75

में फ़ाइलों को खींचें और छोड़ें मुझे अपने WPF एप्लिकेशन में एक छवि फ़ाइल ड्रॉप करने की आवश्यकता है। जब मैं फ़ाइलों को छोड़ देता हूं तो वर्तमान में मेरे पास एक घटना फायरिंग है, लेकिन मुझे नहीं पता कि आगे क्या करना है। मैं छवि कैसे प्राप्त करूं? sender छवि या नियंत्रण ऑब्जेक्ट है?WPF

private void ImagePanel_Drop(object sender, DragEventArgs e) 
{ 
    //what next, dont know how to get the image object, can I get the file path here? 
} 

उत्तर

163

यह मूल रूप से आप करना चाहते हैं।

private void ImagePanel_Drop(object sender, DragEventArgs e) 
{ 

    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
    // Note that you can have more than one file. 
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 

    // Assuming you have one file that you care about, pass it off to whatever 
    // handling code you have defined. 
    HandleFileOpen(files[0]); 
    } 
} 

इसके अलावा, वास्तव में XAML में घटना ऊपर हुक करने, साथ ही AllowDrop विशेषता सेटिंग के रूप में भूल नहीं है।

<StackPanel Name="ImagePanel" Drop="ImagePanel_Drop" AllowDrop="true"> 
    ... 
</StackPanel> 
+0

भयानक एक आकर्षण काम करता है, बस बदली "HandleFileOpen (फ़ाइलें [0]);" "foreach (फ़ाइलों में स्ट्रिंग फ़ाइल) {ओपनफाइल (फ़ाइल);}" - धन्यवाद :) –

+4

यह मेरे लिए काम नहीं कर रहा है:/ –

+0

@Matteo Care विस्तृत करने के लिए? –

33

छवि फ़ाइल e पैरामीटर, जो DragEventArgs class का एक उदाहरण है में निहित है।

विशेष रूप से, e.Data member जाँच (sender पैरामीटर उद्देश्य यह है कि घटना उठाया करने के लिए एक संदर्भ है।); जैसा कि दस्तावेज़ बताता है, यह डेटा ऑब्जेक्ट (IDataObject) का संदर्भ देता है जिसमें ड्रैग ईवेंट से डेटा होता है।

IDataObject इंटरफ़ेस आपके द्वारा बाद में डेटा ऑब्जेक्ट को पुनर्प्राप्त करने के लिए कई विधियां प्रदान करता है। आप जिस डेटा के साथ काम कर रहे हैं उसका प्रारूप ढूंढने के लिए आप शायद GetFormats method पर कॉल करके प्रारंभ करना चाहते हैं। (उदाहरण के लिए, क्या यह एक वास्तविक छवि है या बस छवि फ़ाइल का पथ है?)

फिर, एक बार जब आप फ़ाइल के प्रारूप को पहचानने के प्रारूप की पहचान कर लेंगे, तो आप एक विशिष्ट ओवरलोड को कॉल करेंगे GetData वास्तव में किसी विशेष प्रारूप में डेटा ऑब्जेक्ट को पुनर्प्राप्त करने के लिए विधि।

7

इसके अतिरिक्त एआर के जवाब के लिए। कृपया ध्यान दें कि यदि आप निम्नलिखित सामग्री जानना चाहते हैं तो TextBox का उपयोग करना चाहते हैं।

TextBoxDragAndDrop के लिए पहले से ही कुछ डिफ़ॉल्ट हैंडलिंग प्रतीत होता है। यदि आपकी डेटा ऑब्जेक्ट String है, तो यह बस काम करता है। अन्य प्रकारों को संभाला नहीं जाता है और आपको निषिद्ध माउस प्रभाव मिलता है और आपका ड्रॉप हैंडलर कभी नहीं कहा जाता है।

ऐसा लगता है जैसे आप एक PreviewDragOver ईवेंट हैंडलर में e.Handledको सच के साथ अपने स्वयं निपटने सक्षम कर सकते हैं।

XAML

<TextBox AllowDrop="True" x:Name="RtbInputFile"  HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" /> 

सी #

RtbInputFile.Drop += RtbInputFile_Drop;    
RtbInputFile.PreviewDragOver += RtbInputFile_PreviewDragOver; 

private void RtbInputFile_PreviewDragOver(object sender, DragEventArgs e) 
{ 
    e.Handled = true; 
} 

private void RtbInputFile_Drop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
       // Note that you can have more than one file. 
       string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
       var file = files[0];     
       HandleFile(file); 
    } 
} 
+0

एआर का उदाहरण पूर्वावलोकन ड्रैग ओवर हैंडलर को याद करता है, जो कि बनाना महत्वपूर्ण है यह सब एक साथ आते हैं। कुडोस। –

संबंधित मुद्दे

 संबंधित मुद्दे