WPF鼠标下降事件

本文关键字:事件 鼠标 WPF | 更新日期: 2023-09-27 18:20:35

我有一个视觉树,看起来像这样:

包含ScrollViewerBorder,包含TexBlock

ScrollViewer占据了Border的100%空间,而TextBlock可能占据或不占据ScrollViewer的100%空间取决于用户如何配置它

当用户单击Border中的任何位置时,我想捕获一个MouseDown事件。当我为BorderScrollViewer注册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;

WPF鼠标下降事件

您可以在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方法的人来说,有些信息是使用路由策略,称为隧道(从上到下),这与气泡相反(从下到上)