我创建了一个用户控件,其中包含画布和画布上的按钮。为了能够在画布上移动按钮,我附加了如下所示的 DragBehavior:
class DragOverCanvasBehavior : Behavior<FrameworkElement>
{
private Point _mouseStartPosition;
protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (sender, e) =>
{
_mouseStartPosition = e.GetPosition((Canvas) AssociatedObject.Parent);
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseLeftButtonUp += (sender, e) => AssociatedObject.ReleaseMouseCapture();
AssociatedObject.MouseMove += (sender, e) =>
{
var point = e.GetPosition((Canvas)AssociatedObject.Parent) - _mouseStartPosition;
if (AssociatedObject.IsMouseCaptured)
{
Canvas.SetTop(AssociatedObject, point.Y);
Canvas.SetLeft(AssociatedObject, point.X);
}
};
}
}
出于商业原因,如果我按住并拖动画布,我也需要移动画布。我用一个类似的 Behavior 类来完成它,它改变了画布边距,让它看起来好像它随着鼠标指针拖动而移动。此行为还捕获鼠标。
现在的问题是 - 如果我单击并拖动按钮,画布也会获得鼠标事件并开始被拖动。如何确保在拖动按钮时画布行为不会收到鼠标事件。
我尝试将 e.Handled = true 放在 Behaviors 中,但这没有用。
如果我发现鼠标已经被其他对象捕获,我可以在行为中设置条件以不再捕获它。