我的Canvas中有一些自定义控件。
可以通过拖放移动控件,也可以通过单击选择。
现在,我实现了拖放这样的东西:
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseLeftButtonDown(e);
this.isDragInProgress = false;
// Cache the mouse cursor location.
this.origCursorLocation = e.GetPosition(this);
// Walk up the visual tree from the element that was clicked,
// looking for an element that is a direct child of the Canvas.
var source = e.Source;
var element = this.FindCanvasChild(source as DependencyObject);
if (element == null || !(element is MyControl))
return;
this.ElementBeingDragged = element;
// Get the element's offsets from the four sides of the Canvas.
this.draggedLeft = Canvas.GetLeft(this.ElementBeingDragged);
this.darggedTop = Canvas.GetTop(this.ElementBeingDragged);
// Set the Handled flag so that a control being dragged
// does not react to the mouse input.
e.Handled = true;
this.isDragInProgress = true;
}
现在,我的问题是我无法选择MyControl点击它...(自定义控件上没有MouseClick事件,现在MouseDown也没有工作..)
如果我发表评论e.Handled = true;
,控件会在拖动时更改选择,如果不对其进行评论,控件将不会更改选择....(
答案 0 :(得分:5)
不是在MouseDown处理程序中开始拖动操作,而是可以保存一些初始状态,而是提交拖动MouseMove处理程序,在那里您可以检查SystemParameters.MinimumHorizontalDragDistance
和SystemParameters.MinimumVerticalDragDistance
以查看是否存在已经足够的动作开始拖动操作。然后,您可以在MouseUp处理程序中包含代码以完成拖动操作,或者如果因为移动太小而从未启动过,请执行select操作。
答案 1 :(得分:0)
我刚刚编写了一篇可能对您有帮助的代码项目文章。这篇文章是关于拖动选择和多项拖动。
在MouseMove事件处理程序中,有一些代码可以测试用户拖动的距离是否超过阈值距离,当发生这种情况时,启动拖动操作。