【问题标题】:TextBox - Drag and Drop with Right mouse文本框 - 用鼠标右键拖放
【发布时间】:2016-10-16 02:41:38
【问题描述】:

我正在尝试实现 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 年了,所以从那时起可能发生了一些变化。

有人吗?

【问题讨论】:

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


    【解决方案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;
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 嘿,我正在通过代码添加QueryContinueDragHandler。所以很明显我搞砸了。我尝试了你的方式(在 XAML 中添加),它就像一个魅力。感谢您的帮助:)
    • 实际上,额外的问题:V 我如何在QueryContinueDragHandler 中访问destination?因为现在我将文本从一个字段移动到另一个字段,但我无法交换它。我想最适合它的应该是在textBox.Text = String.Empty; 之前,但我不知道如何获取我们丢弃的对象。还尝试添加 Drop 处理程序,但如果 TextBox 不为空,则不会执行...
    • 您是否尝试在您的 XAML 中将 PreviewDragOver 处理程序添加到目标控件?类似PreviewDragOver="PreviewDragOver"
    • 我做到了,但 PreviewDragOver 被调用了数百次。我最终通过将 DoDragDrop 函数 (textBox.Text) 的第二个参数替换为添加 DragSource 数据的 DataObject 来破解它。然后在PreviewDrop 函数中我做e.Data.GetData("DragSource");。有效,但感觉像是大量的解决方法......
    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多