2010-11-26 25 views
22

私はこの問題を探究し、人々は同様の質問に答えましたが、何らかの理由で私は何もできません。私はここで何かを見逃しているに違いありません...とにかく、次のコードを実行すると、TextBox_DragEnterハンドラは決して呼び出されません。しかし、xamlのTextBox要素をTextBlock要素に変更すると、それが呼び出されます。 TextBox要素から同じ動作を取得する方法はありますか?次のコードは、問題を完全に隔離する...Wpf:ドラッグアンドドロップをテキストボックス

MainWindow.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) 
     { 

     } 
    } 
} 

多くの感謝!

アンドリュー

EDIT:

だけ明確にする、私は、テキストボックスにカスタムオブジェクトをドロップできるようにしたいと思います。テキストボックスのドロップハンドラーで、私は、オブジェクト内のプロパティにテキストボックスのテキストを設定し、TextBoxのIsReadOnlyプロパティをfalseに設定するとします。 TextBoxのドラッグアンドドロップを可能にするいくつかの問題があります。

答えて

40

PreviewDragOverのハンドラを追加する場合、e.Handled = trueに設定すると動作します。

いずれにしても私のために働きます。

+0

おかげリズ!それは素晴らしい作品です! – Andrew

+0

+1ありがとう、私のために働いた... しかし、それはDragEnterイベントで設定されたエフェクトをリセットします。これを処理するための洗練された方法を見つける必要があります。 – Indigo

12

TextBoxは、既にDragAndDropのデフォルト処理があるようです。データオブジェクトがStringの場合は、単に機能します。他のタイプは処理されず、Forbiddenマウスエフェクトが表示され、Dropハンドラは呼び出されません。

PreviewDragOverイベントハンドラでは、e.Handledtrueで独自の処理を有効にできるようです。

MSDNの詳細については見つかりませんでしたが、 が見つかりましたhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF非常に役に立ちました。

4

PreviewDragOnterはPreviewDragOverと同じ方法で処理することも、最初のピクセルでは禁止されたマウスをデフォルトにすることもできます。

ハンドラでは、DragEventArgs.Dataが削除するタイプであることを確認してください。そうであれば、DragEventsArgs.EffectsをDragDropEffects.MoveまたはAllowedEffectsの何かに設定します。ドロップするタイプでない場合は、ドロップを無効にするDragDropEffects.Noneに設定します。 MVVMライト用

XAML:ViewModelにで

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

ハンドラ:

 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

それが動作し、TextBoxのtext = files [0]を設定することによって、テキストボックスのテキストをファイルパスにします。 –

関連する問題