2011-03-27 8 views
14

माता-पिता से बाल नियंत्रण में खींचते समय मुझे DragLeave ईवेंट मिल रहा है। मैं केवल नियंत्रण की सीमाओं के बाहर जाने के दौरान इस घटना को प्राप्त करने की उम्मीद करता हूं। मैं इसे कैसे कार्यान्वित कर सकता हूं?डब्ल्यूपीएफ ड्रैग ड्रॉप - ड्रैगलेव फायर कब होता है?

कृपया इस सरल नमूना आवेदन का संदर्भ लें।

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <TextBox Height="50" >Hilight and Drag this text</TextBox> 
     <Border BorderBrush="Blue" BorderThickness="2"> 
      <StackPanel AllowDrop="True" Name="Stack" > 
       <Label >If I drag text across the gray line, Stack.DragLeave will fire.</Label> 
       <Separator></Separator> 
       <Label>I only expect to get this event when leaving the blue rectangle. </Label> 
      </StackPanel> 
     </Border> 
     <TextBlock >Stack.DragLeave Count: <Label x:Name="countLabel" /></TextBlock> 
    </StackPanel> 
</Window> 

और पीछे

Class MainWindow 

    Private Sub Stack_DragLeave(ByVal sender As Object, ByVal e As System.Windows.DragEventArgs) Handles Stack.PreviewDragLeave 
     countLabel.Content = countLabel.Content + 1 
    End Sub 

End Class 

enter image description here

+0

[DragDrop - DragEnter/DragLeave घटनाक्रम सक्रिय रहता] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2632821/dragdrop-dragenter-dragleave-events-keep -फायरिंग) –

उत्तर

17

मैं हाल ही में मेरे अपने अनुप्रयोग है कि उपयोग कर रहा है WPF खींचें/बड़े पैमाने पर छोड़ पर काम कर रहा हूँ कोड में और आधा दिन बिताने के बाद (डिबगिंग , गुगलिंग, री-रीडिंग डॉक्यूमेंटेशन) ठीक उसी मुद्दे पर जिसे आप देख रहे हैं, मैं केवल यह निष्कर्ष निकाल सकता हूं कि WPF लाइब्रेरी में कहीं भी "भविष्य में वृद्धि" दफन हुई है।

यह मेरा समाधान था:

protected virtual void OnTargetDragLeave(object sender, DragEventArgs e) 
    { 
     _dragInProgress = false; 

     // It appears there's a quirk in the drag/drop system. While the user is dragging the object 
     // over our control it appears the system will send us (quite frequently) DragLeave followed 
     // immediately by DragEnter events. So when we get DragLeave, we can't be sure that the 
     // drag/drop operation was actually terminated. Therefore, instead of doing cleanup 
     // immediately, we schedule the cleanup to execute later and if during that time we receive 
     // another DragEnter or DragOver event, then we don't do the cleanup. 
     _target.Dispatcher.BeginInvoke(new Action(()=> { 
           if(_dragInProgress == false) OnRealTargetDragLeave(sender, e); })); 
    } 

    protected virtual void OnTargetDragOver(object sender, DragEventArgs e) 
    { 
     _dragInProgress = true; 

     OnQueryDragDataValid(sender, e); 
    } 
+0

धन्यवाद डीएक्सएम, यह बच्चों के नियंत्रण के विशाल बहुमत के लिए समस्या को ठीक करने लगता है। हालांकि, सेपरेटर नियंत्रण (और शायद अन्य भी) पर खींचने पर OnQueryDragDataValid विधि का आह्वान किया जा सकता है। – PeterM

+1

@ पीटर, OnQueryDragDataValid() पर कॉल जिसे मैंने वहां जोड़ा था, मेरे विशिष्ट कार्यान्वयन के लिए था। मुझे नहीं लगता कि इसे वहां होने की जरूरत है, अगर आपको इसकी आवश्यकता नहीं है। मेरा डिज़ाइन (और मुझे लगता है कि डब्ल्यूपीएफ भी इस तरह से चाहता है) था कि OnQueryDragDataValid() को कई बार बुलाया जा सकता है और आपको बस यह सत्यापित करने की आवश्यकता है कि ड्रॉप ऑपरेशन मान्य होगा। – DXM

+0

@ डीएमएक्स, हाँ आप बिल्कुल सही हैं। मैं लिखना चाहता था कि एक पृथक नियंत्रण पर खींचते समय OnRealTargetDragLeave आग लगती है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि "विभाजक नियंत्रण किसी भी कीबोर्ड, माउस, माउस व्हील, या टैबलेट इनपुट पर प्रतिक्रिया नहीं करता है और इसे सक्षम या चयनित नहीं किया जा सकता है। (एमएसडीएन से)"। हालांकि, विभाजक आसानी से अन्य समान नियंत्रण (रेखा, आयताकार, आदि) के साथ प्रतिस्थापित किया जा सकता है जो काम करेगा। महान काम के लिए फिर से धन्यवाद! – PeterM

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