我正在用Microsoft Blend构建Windows Presentation Foundation控件。WPF Mousedown => No MouseLeave Event
当我按下鼠标左键离开控件时,MouseLeave事件不会引发。为什么不?
我正在用Microsoft Blend构建Windows Presentation Foundation控件。WPF Mousedown => No MouseLeave Event
当我按下鼠标左键离开控件时,MouseLeave事件不会引发。为什么不?
这是预期的行为:当你在做的一个关于控制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,当按下鼠标键
比较的位置与Top
,Left
和Size
有问题的控件的属性。
决定是否需要停止控制捕获鼠标。
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;
)。忘记了一个:)
但是,如果我在鼠标离开整个窗口时需要提升MouseLeave,该怎么办?当鼠标不在Window中时,我想我不会收到MouveMouve事件,所以基于MouseMove的解决方案将无法工作。或者我错了? – SiberianGuy 2013-04-12 15:14:34
@Idsa它也适用于Forms。 – dognose 2013-04-15 08:53:28
但我们在这里讨论WPF。我怀疑它会适用于WPF窗口 – SiberianGuy 2013-04-15 11:34:26
当我没有得到鼠标事件时,我希望我通常使用Snoop来帮助我理解正在发生的事情。
这里有几个环节:
这并没有真正回答这个问题。 – 2013-04-19 00:08:46
而且的完整性和历史的原因(不是赏金 - 它没有任何意义有两个重复的问题 - 你或许应该将其移动到一个,如果不是太晚了)...
我做了使用
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}"
...更多细节在那里
什么是你的控制里面?我在想这是因为对象(例如一个按钮)在您的控件内部收到MouseDown事件时已将“Mouse.IsCaptured”设置为true,因此它只处理MouseEvent。 – ASanch 2010-09-26 17:36:26
这只是一个边框,网格,图像和2个标签。那可能吗? – 2010-09-28 20:28:03
我们遇到同样的问题(请参阅问题:http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down)。所以我在这里开了一个奖金来吸引注意力。 – SiberianGuy 2013-04-12 13:26:44