文本框 - 用鼠标右键拖放

TextBox - Drag and Drop with Right mouse

我正在尝试实现 2 个文本框之间的文本交换。想法是,你有几个,当你右键单击其中一个时,拖放另一个,第一个文本到第二个文本,第二个文本到第一个文本。所以基本上是文本交换(实际上后来我想交换字体名称、大小等......但一次一步)。

所以我遇到的问题是关于 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 上按下鼠标右键时,就会执行此功能。不幸的是,只要我稍微移动一下鼠标,文本就会被粘贴到同一个文本框中:/我不明白为什么…… 如果我使用 PreviewMouseLeftButtonDown,它的行为方式不同,我可以将鼠标光标拖出 TextBox。


我在这里发现了类似的问题 => WPF DragDrop.DoDragDrop (for a RIGHT-Click?) 并试图在我的代码中添加 DragDrop.AddQueryContinueDragHandler(this, QueryContinueDragHandler); 位,但这似乎不起作用:/ 而且从那时起已经有 5 年了,所以也许从那时起发生了一些变化。

有人吗?

我不知道你是如何添加 QueryContinueDragHandler(也许是通过代码?),但这样 "right button d&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;
    }
}

希望对您有所帮助