我正在尝试制作一个自定义 WPF 控件,其中基于绑定到 TranslateTransform 的数据的两个双精度(TranslateX,TranslateY)应用 TranslateTransform,这在使用按钮或滚动条来操作两个双精度时效果很好,但是我希望用户在自定义控件内拖动以翻译其中的控件。
为此,我在自定义控件中添加了 PreviewMouseDown、Up 和 Move 处理程序。(据我了解,我应该始终收到“预览”事件,因为它们从底部向下隧道而不是冒泡)。
//Inside the constructor of the custom control
Mouse.AddPreviewMouseDownHandler(this, new MouseButtonEventHandler(MouseDown));
Mouse.AddPreviewMouseUpHandler(this, new MouseButtonEventHandler(MouseUp));
Mouse.AddPreviewMouseMoveHandler(this, new MouseEventHandler(MouseMoved));
这些事件通过以下方法处理:
private void OnMouseDown(object o, MouseEventArgs args)
{
Mouse.Capture(this, CaptureMode.Element);
prevMousePosition = args.GetPosition(this);
}
private void OnMouseUp(object o, MouseEventArgs args)
{
Mouse.Capture(this, CaptureMode.None);
}
private void OnMouseMoved(object o, MouseEventArgs args)
{
if (args.LeftButton == MouseButtonState.Pressed)
{
Vector change = prevMousePosition - args.GetPosition(this);
TranslateX += change.X;
TranslateY += change.Y;
prevMousePosition = args.GetPosition(this);
}
}
然而,OnMouseMoved 方法仅在我疯狂移动鼠标时调用,而不是在我缓慢移动它时调用(大多数人在拖动时会这样做)。此外(可以理解)当我离开自定义控件时,事件完全停止触发,而用户可能希望继续拖动而无需重新定位鼠标。
所以我的问题是:我如何捕获鼠标位置及其移动事件,以便用户可以在自定义控件内平滑拖动,并且即使他们的拖动导致鼠标超出自定义控件也可以继续拖动?
(小记:我还在用.NET 3.5)