gpt4 book ai didi

c# - 我可以在 Mouse.Capture() 处于事件状态时获得 MouseLeave 事件吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:24 26 4
gpt4 key购买 nike

我有一个按钮。在 Button.MouseRightButtonDown 上,我调用了 Mouse.Capture(button),因为我想检测是否有人在 Button 之外释放了右键单击。

我还注册了一个 Button.MouseLeave 事件。如果有人右键单击-将鼠标拖离按钮,我希望触发此事件。

不幸的是,Mouse.Capture 似乎以某种方式阻止了 MouseLeave 的发生。

有谁知道解决方法,或者可以指出我哪里出错了?

(顺便说一句,如果有人对我这样做的目的感到好奇,请参阅 my other question。)

最佳答案

捕获鼠标后,您可以使用 MouseMove 和 HitTest 来确定鼠标是在您的元素内还是在其他元素内。

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);

if (this.IsMouseCaptured)
{
HitTestResult ht = VisualTreeHelper.HitTest(this, e.GetPosition(this));
if (ht != null)
{
DependencyObject current = ht.VisualHit;
while (current != this && current != null)
{
current = VisualTreeHelper.GetParent(current);
}

if (current == this)
{
Debug.WriteLine("Inside");
return;
}
}

Debug.WriteLine("Outside");
}
}

下面的代码可以用来避免树遍历:

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);

if (this.IsMouseCaptured)
{
bool isInside = false;

VisualTreeHelper.HitTest(
this,
d =>
{
if (d == this)
{
isInside = true;
}

return HitTestFilterBehavior.Stop;
},
ht => HitTestResultBehavior.Stop,
new PointHitTestParameters(e.GetPosition(this)));

if (isInside)
{
Debug.WriteLine("Inside");
}
else
{
Debug.WriteLine("Outside");
}
}
}

关于c# - 我可以在 Mouse.Capture() 处于事件状态时获得 MouseLeave 事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com