在WPF中选择和拖动之间有所区别

时间:2010-11-20 15:55:46

标签: .net wpf wpf-controls

我的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;,控件会在拖动时更改选择,如果不对其进行评论,控件将不会更改选择....(

2 个答案:

答案 0 :(得分:5)

不是在MouseDown处理程序中开始拖动操作,而是可以保存一些初始状态,而是提交拖动MouseMove处理程序,在那里您可以检查SystemParameters.MinimumHorizontalDragDistanceSystemParameters.MinimumVerticalDragDistance以查看是否存在已经足够的动作开始拖动操作。然后,您可以在MouseUp处理程序中包含代码以完成拖动操作,或者如果因为移动太小而从未启动过,请执行select操作。

答案 1 :(得分:0)

我刚刚编写了一篇可能对您有帮助的代码项目文章。这篇文章是关于拖动选择和多项拖动。

在MouseMove事件处理程序中,有一些代码可以测试用户拖动的距离是否超过阈值距离,当发生这种情况时,启动拖动操作。

http://www.codeproject.com/KB/WPF/SimpleDragSelection.aspx