我试图在两个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年,所以也许从那以后发生了一些变化。
任何?
答案 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;
}
}
我希望它可以帮到你。