文本框 - 用鼠标右键拖放
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;
}
}
希望对您有所帮助
我正在尝试实现 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;
}
}
希望对您有所帮助