WPF में फ़ाइलों को खींचें और छोड़ें


106

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

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?
}

जवाबों:


211

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

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]);" "foreach (फ़ाइलों में स्ट्रिंग फ़ाइल) {Openfile (फ़ाइल);}" - धन्यवाद :)
Eamonn McEvoy

1
क्षमा करें :) मेरा मतलब है कि ड्रैग एंड ड्रॉप काम नहीं करता है। AllowDropट्रू पर सेट है, लेकिन Dropईवेंट हैंडलर को कभी नहीं बुलाया जाता है। जब मैं खिड़की पर एक फ़ाइल खींचता हूं, तो मुझे
mcont

4
मैंने एक Gridमूल तत्व का उपयोग किया , Borderअंदर कुछ के साथ Backgroundसेट संपत्ति के साथ (सफेद ठीक है, लेकिन पारदर्शी नहीं है)। अंदर Borderमैंने वास्तविक सामग्री डाल दी।
मोंट

1
जब ग्रिड पर ड्रॉप करने की कोशिश हो रही हो तो बैकग्राउंड को ट्रांसपेरेंट काम करना मेरे लिए ठीक है। जाहिर तौर पर आपको बैकग्राउंड चाहिए इसलिए हिट टेस्ट होता है। इस ब्लॉग प्रविष्टि के लिए धन्यवाद: codeinreview.com/136/en enable
drag-

1
एक वास्तविक गोत्चा यह है कि यदि आप VisualStudio को व्यवस्थापक के रूप में चलाते हैं - अपने ऐप को डिबग करें - और FileExplorer से खींचें क्योंकि गैर-व्यवस्थापक सुरक्षा संदर्भ अलग है और कोई ड्रैग इवेंट ट्रिगर नहीं होगा। मुझे जीवन के 30 मिनट खर्च हुए।
हंस कार्लसन

35

छवि फ़ाइल eपैरामीटर में निहित है , जो DragEventArgsवर्ग का एक उदाहरण है ।
( senderपैरामीटर में उस वस्तु का संदर्भ होता है जिसने घटना को उठाया है।)

विशेष रूप से, e.Dataसदस्य की जांच करें ; जैसा कि प्रलेखन बताता है, यह डेटा ऑब्जेक्ट ( IDataObject) में ड्रैग इवेंट से डेटा को संदर्भित करता है ।

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

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


12

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

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

ऐसा लगता है कि आप किसी इवेंट हैंडलर में अपनी खुद की हैंडलिंग e.Handledको सही से सक्षम कर सकते हैं PreviewDragOver

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);  
     }
}

1
AR का उदाहरण PreviewDragOver हैंडलर को याद करता है, जो सभी को एक साथ लाने के लिए महत्वपूर्ण है। कुडोस।
ग्रेग वोगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.