如何检测控件上的完整鼠标单击(向下和向上)?

时间:2014-11-20 00:38:39

标签: c# wpf mvvm mouseevent

在带MVVM的WPF中(没有代码隐藏),说我有一个Rectangle。如果用户点击矩形,我想执行一个动作。我实际上希望在鼠标上进行操作。 然而,我只想在矩形上执行完全点击(即鼠标向下和鼠标向上)时触发操作。如果他们点击其他控件,按下鼠标,将其移到矩形上,然后释放鼠标,我想要触发操作。

MouseDown事件和MouseUp事件,但我真正想要的是“MouseClick”事件(就像在WinForms中一样)。是否有任何内置的鼠标点击事件/触发器/某些功能?如果没有,最好的办法是什么?定制触发器?附加行为?

2 个答案:

答案 0 :(得分:1)

嗯,它并不完美,但我创建了一个自定义触发器来解决问题。如果有人有,我仍然愿意接受任何更好的解决方案。

public class MouseClickTrigger : TriggerBase<UIElement>
{
    private bool _isMouseDown;

    protected override void OnAttached()
    {
        this.AssociatedObject.MouseDown += this.AssociatedObject_MouseDown;
        this.AssociatedObject.MouseUp += this.AssociatedObject_MouseUp;
        this.AssociatedObject.MouseLeave += this.AssociatedObject_MouseLeave;
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.MouseDown -= this.AssociatedObject_MouseDown;
        this.AssociatedObject.MouseUp -= this.AssociatedObject_MouseUp;
        this.AssociatedObject.MouseLeave -= this.AssociatedObject_MouseLeave;
    }

    private void AssociatedObject_MouseDown(object sender, MouseButtonEventArgs e)
    {
        this._isMouseDown = true;
    }

    private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
    {
        bool fullClick = this._isMouseDown;
        this._isMouseDown = false;
        if (fullClick)
        {
            this.InvokeActions(e);
        }
    }

    private void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
    {
        this._isMouseDown = false;
    }
}

答案 1 :(得分:0)

Whaaaaat ???我不是你的问题...为什么你不能做这样的事情:

private bool isMouseDownInRect = false;

    <Rectangle Width="100" Height="100" MouseUp="UIElement_OnMouseUp" MouseDown="UIElement_OnMouseDown" Fill="Black"></Rectangle>

    private void UIElement_OnMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (isMouseDownInRect)
        {
          // My code  
        }

        isMouseDownInRect = false;
    }

    private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        isMouseDownInRect = true;
    }

我希望这就是你所要求的。

编辑:

别忘了处理mouse_enter / leave事件......