2016-10-16 2 views
0

Я пытаюсь выполнить обмен текста между 2 текстовыми полями. Идея состоит в том, что у вас их мало, и когда вы щелкаете правой кнопкой мыши по одному из них, перетащите и перетащите на другой, а текст с первого на второй, а текст второго - на первый. Итак, в основном обмен текстовыми сообщениями (на самом деле позже я хочу поменять имя, размер и т. Д.), Но один шаг в то время).TextBox - перетаскивание с помощью правой мыши

Так что проблема связана с обработчиками RightClick ... По умолчанию при щелчке правой кнопкой мыши появляется ContextMenu, поэтому я отключил его (выполнив ContextMenu="{x:Null}"). я уже знаю, что добавление обработчики MouseRightButtonDown не сработает так, я добавляю его PreviewMouseRightButtonDown и C# код для этого выглядит следующим образом:

private void PreviewMouseRightButtonDownHandler(object sender, MouseButtonEventArgs e) 
{ 
    DragDrop.DoDragDrop(e.Source as DependencyObject, 
         (sender as Textbox).Text, 
         DragDropEffects.Move); 
} 

Теперь при нажатии правой кнопки мыши над моей TextBox эта функция выполняется , К сожалению, как только я немного передвигаю мышь, текст вставляется в тот же TextBox:/И я не понимаю, почему ... Если я использую PreviewMouseLeftButtonDown, он не ведет себя одинаково, и я могу перетащить курсор мыши из TextBox.


Я нашел подобный вопрос здесь =>WPF DragDrop.DoDragDrop (for a RIGHT-Click?) и пытается добавить DragDrop.AddQueryContinueDragHandler(this, QueryContinueDragHandler); немного в моем коде, но это не похоже на работу:/ Кроме того, это было как 5 лет с тех пор, так может быть что-то есть с тех пор изменился.

Кто-нибудь?

ответ

1

Я не знаю, как вы добавляете QueryContinueDragHandler (возможно по коду?), Но в этом случае «правая кнопка d & д» работает для меня (конечно, я был вдохновлен question вы связаны)

В XAML:

<StackPanel Orientation="Vertical"> 
    <TextBox Margin="10" 
       PreviewMouseRightButtonDown="PreviewMouseRightButtonDownHandler" 
       DragDrop.PreviewQueryContinueDrag="QueryContinueDragHandler" /> 
    <TextBox Margin="10" Text="Drag me" 
       PreviewMouseRightButtonDown="PreviewMouseRightButtonDownHandler" 
       DragDrop.PreviewQueryContinueDrag="QueryContinueDragHandler" /> 
</StackPanel> 

А в коде позади:

private void PreviewMouseRightButtonDownHandler(object sender, MouseButtonEventArgs e) 
{ 
    TextBox textBox = sender as TextBox; 
    if (textBox != null) 
    { 
     DragDrop.DoDragDrop(e.Source as DependencyObject, 
      textBox.Text, DragDropEffects.Move); 

     e.Handled = true; 
    } 
} 
private void QueryContinueDragHandler(object source, QueryContinueDragEventArgs e) 
{ 
    TextBox textBox = source as TextBox; 

    e.Handled = true; 

    if (e.EscapePressed) 
    { 
     e.Action = DragAction.Cancel; 
     return; 
    }    

    if ((e.KeyStates & DragDropKeyStates.LeftMouseButton) != DragDropKeyStates.None) 
    { 
     e.Action = DragAction.Continue; 
     return; 
    } 

    if ((e.KeyStates & DragDropKeyStates.RightMouseButton) != DragDropKeyStates.None) 
    { 
     e.Action = DragAction.Continue; 
     return; 
    } 

    e.Action = DragAction.Drop; 

    if (textBox != null) 
    { 
     textBox.Text = String.Empty; 
    } 
} 

Я надеюсь, что это может помочь вам.

+0

Эй, я добавлял «QueryContinueDragHandler» по коду. Так что, очевидно, я что-то испортил. Я пробовал свой путь (добавлен в XAML), и он работает как шарм. Спасибо за помощь :) – 3vilguy

+0

На самом деле, вопрос бонуса: V Как мне получить доступ к 'destination' в' QueryContinueDragHandler'? Потому что теперь я перемещаю текст из одного поля в другое, но я не могу его поменять. Я предполагаю, что идеально подходит для него, как раз перед 'textBox.Text = String.Empty;', но я не знаю, как получить объект, который мы сбросили. Также пытался добавить обработчик Drop, но он не выполняется, если TextBox не пуст ... – 3vilguy

+0

Вы пытались добавить в свой XAML обработчик 'PreviewDragOver' к целевому элементу управления? Что-то вроде 'PreviewDragOver =" PreviewDragOver "' –

Смежные вопросы