【发布时间】:2020-07-31 02:01:02
【问题描述】:
我一直在尝试使用鼠标事件处理程序。使用 MouseDown 似乎只适用于鼠标右键。并且 PreviewMouseLeftButton 在我释放左键之前不会激活 MouseMove 事件。
所以这段代码:
private void NewButton_MouseDown(object sender, MouseButtonEventArgs e)
{
var test = e.LeftButton;
var test2 = e.RightButton;
if (!bButtonIsDown)
{
bButtonIsDown = true;
Button mover = (Button)sender;
pntEnterPoint = e.GetPosition(this.cnvsLinkScreen);
cnvsLinkScreen.MouseMove += CnvsLinkScreen_MouseMove;
cnvsLinkScreen.MouseUp += CnvsLinkScreen_MouseUp;
spMover = (StackPanel)((Button)sender).Parent;
pntPreviousPoint.X = Canvas.GetLeft(spMover);
pntPreviousPoint.Y = Canvas.GetTop(spMover);
}
}
private void NewButton_MouseMove(object sender, MouseEventArgs e)
{
Button mover = (Button)sender;
StackPanel spMover = (StackPanel)((Button)sender).Parent;
base.OnMouseMove(e);
if (e.LeftButton == MouseButtonState.Pressed)
{
// Inititate the drag-and-drop operation.
FindChild<StackPanel>(cnvsLinkScreen, "CSVImport");
pntEnterPoint = e.GetPosition(this.cnvsLinkScreen);
Canvas.SetLeft(spMover, pntEnterPoint.X + 1);
Canvas.SetTop(spMover, pntEnterPoint.Y + 1);
}
}
有效,但只有右键。启用事件处理程序时:
newButton.MouseDown += NewButton_MouseDown;
鼠标左键不会触及该事件处理程序,我认为这很奇怪。
我已经阅读了大量内容,人们参考了 PreviewMouseLeftButtonDown 事件处理程序,但是当我在适当的位置使用它(相同的代码)时,cnvsLinkScreen.MouseMove += CnvsLinkScreen_MouseMove 不会触发,直到我放开左边鼠标按钮(按钮向上),然后 StackPanel 拖动,直到我单击并放下它。
我设置了断点并看到事件处理程序正在设置,但是直到释放左按钮后它才起作用。显然,我在这个事件处理程序上遗漏了一些东西。
为什么 MouseDown 事件处理程序甚至没有按下鼠标左键触发;只需按下鼠标右键?
【问题讨论】:
-
请注意,WPF 内置了对拖放的支持:docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/…
-
是的,我这样做是为了在画布中获取对象,但是当我尝试这样做以移动它们时,对象不会在画布上滑动,而是鼠标图标发生变化并且对象保持原位,直到我放开鼠标。我想要对象在拖动时移动的动画。