WPF Mousedown =>没有MouseLeave事件

时间:2010-09-26 12:50:52

标签: wpf events mouse

我正在使用Microsoft Blend构建Windows Presentation Foundation控件。

当我通过按下鼠标左键离开我的控件时,不会引发MouseLeave-Event。为什么不呢?

4 个答案:

答案 0 :(得分:7)

这是预期的行为:当您在控件上执行mousedown并离开控件时,控件STILL会在鼠标上保留其“捕获”,这意味着控件不会触发MouseLeave-Event 。一旦将鼠标按钮释放到控件之外,鼠标离开事件将被触发。

为避免这种情况,您可以简单地告诉您的控件不要捕获鼠标:

private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
    Control control = (Control) sender;
    control.Capture = false; //release capture.
}

现在,即使在按下按钮时搬出,MouseLeave事件也会被触发。

如果您需要Capture INSIDE the Control,您需要付出更多努力:

  • 按下鼠标键时,手动开始跟踪鼠标位置

  • 将该位置与相关控件的TopLeftSize属性进行比较。

  • 决定是否需要停止控制捕获鼠标。

    public partial class Form1 : Form
    {
    private Point point;
    private Boolean myCapture = false;
    
    public Form1()
    {
        InitializeComponent();
    }
    
    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        myCapture = true;
    }
    
    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (myCapture)
        {
            point = Cursor.Position;
    
            if (!(point.X > button1.Left && point.X < button1.Left + button1.Size.Width && point.Y > button1.Top && point.Y < button1.Top + button1.Size.Height))
            {
                button1.Capture = false; //this will release the capture and trigger the MouseLeave event immediately.
                myCapture = false;
            }
        }
    }
    
    private void button1_MouseLeave(object sender, EventArgs e)
    {
        MessageBox.Show("Mouse leaving");
    }
    

    }

当然你需要在MouseUp上停止自己的跟踪(myCapture=false;)。忘了一个:))

答案 1 :(得分:2)

当我没有收到鼠标事件时,我希望我通常会使用Snoop帮助我了解正在发生的事情。

以下是几个链接:

1- Snoop (a WPF utility)
   2- CodePlex project for Snoop

答案 2 :(得分:1)

出于完整性和历史原因(不是赏金 - 有两个重复的问题没有意义 - 如果不是太晚,你应该把它移到一个......)

  

我在这里使用global mouse hook做了彻底的解决方案(方法2)
  WPF: mouse leave event doesn't trigger with mouse down

简化其使用 - 您可以通过绑定到视图模型中的命令来使用它 - 例如

my:Hooks.EnterCommand="{Binding EnterCommand}"
my:Hooks.LeaveCommand="{Binding LeaveCommand}"
my:Hooks.MouseMoveCommand="{Binding MoveCommand}"

...有更多细节

答案 3 :(得分:0)

一个老问题,但是我遇到了一个与按钮相同的问题(MouseLeave不会在MouseDown时触发,因为MouseDown会捕获鼠标...)

这是我无论如何解决的方法:

element.GotMouseCapture += element_MouseCaptured;

static void element_MouseCaptured(object sender, MouseEventArgs e)
{
    FrameworkElement element = (FrameworkElement)sender;
    element.ReleaseMouseCapture();
}

希望能帮助某人快速解决问题的希望:P