TextBox - 用鼠标拖放

时间:2016-10-16 02:41:39

标签: wpf drag-and-drop right-click wpf-textbox

我试图在两个TextBox之间实现文本交换。想法是,你几乎没有,当你右键点击其中一个时,拖放到另一个上,第一个文本转到第二个,第二个文本转到第一个。所以基本上是文本交换(实际上后来我想交换字体名称,大小等......但当时只有一步)。

我遇到的问题是关于RightClick处理程序...默认情况下右键单击ContextMenu显示,所以我禁用它(通过执行too broad)。 我已经知道向ContextMenu="{x:Null}"添加处理程序无法正常工作,因此我将其添加到MouseRightButtonDown并且C#代码看起来像这样:

PreviewMouseRightButtonDown

现在当我在TextBox上按下鼠标右键时,会执行此功能。不幸的是,当我移动鼠标时,文本被粘贴到同一个TextBox:/我不明白为什么...... 如果我使用PreviewMouseLeftButtonDown,它的行为方式不同,我可以将鼠标光标拖出TextBox。


我在这里发现了类似的问题=> {{3}} 并试图在我的代码中添加private void PreviewMouseRightButtonDownHandler(object sender, MouseButtonEventArgs e) { DragDrop.DoDragDrop( e.Source as DependencyObject, (sender as Textbox).Text, DragDropEffects.Move); } 位,但这似乎不起作用:/ 此后它已经过了5年,所以也许从那以后发生了一些变化。

任何?

1 个答案:

答案 0 :(得分:1)

我不知道你是如何添加QueryContinueDragHandler(可能是代码?)但是以这种方式"右键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;
    }
}

我希望它可以帮到你。