WPF鼠标下降事件
本文关键字:事件 鼠标 WPF | 更新日期: 2023-09-27 18:20:35
我有一个视觉树,看起来像这样:
包含ScrollViewer
的Border
,包含TexBlock
。
ScrollViewer
占据了Border
的100%空间,而TextBlock
可能占据或不占据ScrollViewer
的100%空间取决于用户如何配置它
当用户单击Border
中的任何位置时,我想捕获一个MouseDown
事件。当我为Border
或ScrollViewer
注册MouseDown
事件时,回调不会被调用。当我向TextBlock
注册MouseDown
事件时,回调确实会被调用,但当然只在TextBlock
的可点击区域,而不是Border
的整个区域。
我的一个想法是创建某种顶级元素,覆盖整个控件,将其可见性设置为隐藏,然后从中获取MouseDown
。
有什么建议吗?如果这个问题有什么不清楚的地方,请告诉我,我会解决的。
显示每个请求的示例代码
// Need to know when a user clicks on anything inside of the border, but the
// because there are items above it, the mouse event doesn't get invoked.
Border border = new Border();
ScrollViewer viewer = new ScrollViewer();
TextBlock textBlock = new TextBlock();
border.Content = viewer;
viewer.Child = textBlock;
您可以在Border
上注册PreviewMouseDown
事件。如果单击包含的元素,它也会激发。
private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var clickedElement = e.OriginalSource;
}
还有一种方法(虽然不是那么干净的IMO),但如果您需要一些自定义行为,它可能会很有用。。。可能:)
我们创建了自定义滚动查看器,然后使用它而不是标准的滚动查看器,我们的自定义控件只会将它的鼠标按下事件传播到它的父控件(此示例过于简单,因此在当前状态下不适合在生产中使用)。
public class CustomScrollViewer : ScrollViewer
{
protected override void OnMouseDown(MouseButtonEventArgs e)
{
((e.Source as FrameworkElement).Parent as UIElement).RaiseEvent(e);
}
}
对于像我这样不熟悉PreviewMouseDown
方法的人来说,有些信息是使用路由策略,称为隧道(从上到下),这与气泡相反(从下到上)