2010-11-26 10 views
22

मैंने इस समस्या को गुमराह किया है, और लोगों ने समान प्रश्नों का उत्तर दिया है, लेकिन किसी कारण से मुझे काम करने के लिए कुछ भी नहीं मिल सकता है। मुझे यहां कुछ याद आना चाहिए था ... किसी भी दर पर, जब मैं निम्नलिखित कोड चलाता हूं, तो TextBox_DragEnter हैंडलर कभी नहीं कहा जाता है। हालांकि, अगर मैं टेक्स्टबॉक्स तत्व को xaml में टेक्स्टब्लॉक तत्व में बदलता हूं, तो इसे कहा जाता है। क्या टेक्स्टबॉक्स तत्व से वही व्यवहार प्राप्त करने का कोई तरीका है?डब्लूपीएफ: ड्रैग एंड ड्रॉप टू टेक्स्टबॉक्स

<Window x:Class="Wpf1.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"> 
    <Grid Name="myGrid"> 
     <TextBox AllowDrop="True" PreviewDragEnter="TextBox_DragEnter" PreviewDrop="TextBox_Drop" /> 
    </Grid> 
</Window> 

MainWindow.xaml.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Collections.ObjectModel; 

namespace Wpf1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void TextBox_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effects = DragDropEffects.Copy; 
     } 

     private void TextBox_Drop(object sender, DragEventArgs e) 
     { 

     } 
    } 
} 

अग्रिम में बहुत धन्यवाद निम्नलिखित कोड पूरी तरह से समस्या ...

MainWindow.xaml को अलग कर!

एंड्रयू

संपादित करें:

बस स्पष्ट करने के लिए, मैं एक टेक्स्ट बॉक्स में एक कस्टम वस्तु छोड़ने की अनुमति देने के लिए करना चाहते हैं। टेक्स्टबॉक्स के लिए ड्रॉप हैंडलर में, मैं ऑब्जेक्ट में टेक्स्टबॉक्स के टेक्स्ट को ऑब्जेक्ट में सेट करना चाहता हूं, और उसके बाद टेक्स्टबॉक्स की IsReadOnly प्रॉपर्टी को गलत पर सेट करना चाहूंगा। मुझे टेक्स्टबॉक्स के लिए ड्रैग और ड्रॉप करने में कुछ परेशानी हो रही है ...

उत्तर

40

यदि आप पूर्वावलोकन ड्रैगओवर के लिए हैंडलर जोड़ते हैं, तो e.Handled = true सेट करना चाहिए।

किसी भी मामले में मेरे लिए काम करता है।

+0

धन्यवाद लिज़! यह बहुत अच्छा काम करता है! – Andrew

+0

+1 धन्यवाद, मेरे लिए भी काम किया ... हालांकि, यह DragEnter ईवेंट में प्रभाव सेट को रीसेट करता है। इसे संभालने के लिए कुछ परिष्कृत तरीके खोजने की आवश्यकता है। – Indigo

12

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

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

मुझे एमएसडीएन में इसके बारे में कोई जानकारी नहीं मिली, लेकिन http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF बहुत उपयोगी पाया।

4

आप पूर्वावलोकन ड्रैग एन्टर को उसी तरह से संभालना चाहेंगे जैसे पूर्वावलोकनड्रागओवर या यह पहले पिक्सेल पर फोरबिडन माउस पर डिफ़ॉल्ट होगा।

हैंडलर में सुनिश्चित करें कि DragEventArgs.Data वह प्रकार है जिसे आप छोड़ना चाहते हैं। यदि ऐसा है, तो DragEventsArgs.Uffects को DragDropEffects.Move या AllowedEffects में कुछ और सेट करें। यदि यह वह प्रकार नहीं है जिसे आप छोड़ना चाहते हैं, तो DragDropEffects पर सेट करें। जो ड्रॉप छोड़ने को अक्षम करता है। MVVM लाइट के लिए

XAML:

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="Drop"> 
      <cmd:EventToCommand Command="{Binding DragDropCommand}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="PreviewDragOver"> 
      <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="PreviewDragEnter"> 
      <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

ViewModel में हैंडलर:

 private void ExecutePreviewDragEnterCommand(DragEventArgs drgevent) 
     { 
      drgevent.Handled = true; 


      // Check that the data being dragged is a file 
      if (drgevent.Data.GetDataPresent(DataFormats.FileDrop)) 
      { 
       // Get an array with the filenames of the files being dragged 
       string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop); 

       if ((String.Compare(System.IO.Path.GetExtension(files[0]), ".xls", true) == 0) 
        && files.Length == 1) 
        drgevent.Effects = DragDropEffects.Move; 
       else 
        drgevent.Effects = DragDropEffects.None; 

      } 
      else 
       drgevent.Effects = DragDropEffects.None; 
     } 
+0

यह काम करता है, और मैं टेक्स्टबॉक्स का टेक्स्ट टेक्स्ट पथ बनकर टेक्स्टबॉक्स बनता हूं [0] –

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