2010-09-26 52 views
13

我正在用Microsoft Blend构建Windows Presentation Foundation控件。WPF Mousedown => No MouseLeave Event

当我按下鼠标左键离开控件时,MouseLeave事件不会引发。为什么不?

+0

什么是你的控制里面?我在想这是因为对象(例如一个按钮)在您的控件内部收到MouseDown事件时已将“Mouse.IsCaptured”设置为true,因此它只处理MouseEvent。 – ASanch 2010-09-26 17:36:26

+0

这只是一个边框,网格,图像和2个标签。那可能吗? – 2010-09-28 20:28:03

+0

我们遇到同样的问题(请参阅问题:http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down)。所以我在这里开了一个奖金来吸引注意力。 – SiberianGuy 2013-04-12 13:26:44

回答

7

这是预期的行为:当你在做的一个关于控制mousedown和离开控制,控制仍保留着“捕获”在鼠标上,意味着控制器不会触发MouseLeave-Event。鼠标离开事件将被触发,一旦Mousebutton被释放到控件之外。

为了避免这种情况,你可以简单的告诉你的控制不捕获鼠标都:

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

现在MouseLeave事件会即使在按下按钮移出时触发。

如果您需要捕获内部的控制,就需要投入更多的精力:

  • 开始手动跟踪mouseposition,当按下鼠标键

  • 比较的位置与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

但是,如果我在鼠标离开整个窗口时需要提升MouseLeave,该怎么办?当鼠标不在Window中时,我想我不会收到MouveMouve事件,所以基于MouseMove的解决方案将无法工作。或者我错了? – SiberianGuy 2013-04-12 15:14:34

+0

@Idsa它也适用于Forms。 – dognose 2013-04-15 08:53:28

+1

但我们在这里讨论WPF。我怀疑它会适用于WPF窗口 – SiberianGuy 2013-04-15 11:34:26

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}" 

...更多细节在那里