gpt4 book ai didi

WPF FrameworkElement 不接收鼠标输入

转载 作者:行者123 更新时间:2023-12-04 02:51:16 24 4
gpt4 key购买 nike

试图让 OnMouse 事件出现在 child 身上 FrameworkElement .父元素是 Panel (并且 Background 属性不是 Null)。

class MyFrameworkElement : FrameworkElement
{
protected override void OnMouseDown(MouseButtonEventArgs e)
{
// Trying to get here!
base.OnMouseDown(e);
}
}

public class MyPanel : Panel
{
protected override void OnMouseDown(MouseButtonEventArgs e)
{
// This is OK
base.OnMouseDown(e);
}
}

OnMouse 永远不会被调用,事件总是未处理,Snoop 告诉我路由事件似乎只能到达 Panel。元素。
<Window 
x:Class="WpfApplication5.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication5"
Title="Window1" Height="300" Width="300">
<Border x:Name="myBorder" Background="Red">
<l:MyPanel x:Name="myPanel" Background="Transparent">
<l:MyFrameworkElement x:Name="myFE"/>
</l:MyPanel>
</Border>
</Window>

文档说 FrameworkElement处理输入,但为什么不在这种情况下?

最佳答案

OnMouseDown仅当您的元素响应 HitTest 时才会被调用。见 Hit Testing in the Visual Layer .默认实现将对 OnRender 中绘制的图形进行 HitTest 。 .创建 PanelTransparent背景工作是因为 Panel在其整个区域绘制一个矩形,该矩形将捕获 HitTest 。您可以通过覆盖 OnRender 获得相同的效果绘制一个透明矩形:

protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawRectangle(Brushes.Transparent, null,
new Rect(0, 0, RenderSize.Width, RenderSize.Height));
}

您也可以覆盖 HitTestCore 以便所有点击都计为点击:
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}

关于WPF FrameworkElement 不接收鼠标输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269120/

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