2010-11-26 4 views
22

나는이 문제를 봤어, 사람들이 비슷한 질문에 대답했지만 어떤 이유로 나는 일할 수 없다. 여기에 뭔가를 놓쳤을 것입니다 ... 어쨌든, 다음 코드를 실행하면 TextBox_DragEnter 핸들러가 호출되지 않습니다. 그러나 xaml의 TextBox 요소를 TextBlock 요소로 변경하면 해당 요소가 호출됩니다. TextBox 요소에서 동일한 동작을 수행 할 수있는 방법이 있습니까?Wpf : 드래그 앤 드롭으로 텍스트 상자에

<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을 분리!

앤드류

편집 :

그냥 내가 텍스트 상자에 사용자 지정 개체를 삭제 할 수 싶습니다 명확합니다. 텍스트 상자의 놓기 처리기에서 텍스트 상자의 텍스트를 개체의 속성으로 설정 한 다음 TextBox의 IsReadOnly 속성을 false로 설정하려고합니다. TextBox에 드래그 앤 드롭을 사용하는 데 문제가 있습니다 ...

답변

40

PreviewDragOver에 대한 처리기를 추가 한 다음 e.Handled = true로 설정하면 작동합니다.

저에게 적합한 작품입니다.

+0

감사 리즈! 그건 잘된거야! – Andrew

+0

+1 감사합니다. 나를 위해 일했습니다 ... 그래도 DragEnter 이벤트에서 설정된 효과를 다시 설정합니다. 이것을 처리 할 수있는 정교한 방법을 찾아야합니다. – Indigo

12

TextBox에는 이미 DragAndDrop에 대한 기본 처리가있는 것 같습니다. 데이터 객체가 String이면 간단하게 작동합니다. 다른 유형은 처리되지 않고 Forbidden 마우스 효과가 발생하고 드롭 처리기가 호출되지 않습니다.

PreviewDragOver 이벤트 핸들러에서 e.Handled부터 true까지 처리하는 것처럼 보입니다.

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 : 뷰 모델에

<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]을 설정하여 텍스트 상자의 텍스트를 파일 경로가되게합니다. –

관련 문제