首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF MouseDown事件

WPF MouseDown事件
EN

Stack Overflow用户
提问于 2015-11-04 16:04:17
回答 2查看 7.3K关注 0票数 3

我有一棵像这样的视觉树:

一个Border,包含一个ScrollViewer,其中包含一个TexBlock

ScrollViewerBorder空间的100%,TextBlock可能占用ScrollViewer空间的100%,也可能不占用ScrollViewer空间的100%,这取决于用户如何配置它。

当用户单击Border中的任何位置时,我希望捕获一个Border事件。当我为BorderScrollViewer注册一个Border事件时,回调不会被调用。当我将MouseDown事件注册到TextBlock时,回调确实会被调用,但当然只在TextBlock的可点击区域,而不是Border的整个区域。

我的一个想法是创建某种顶级元素,它将遍历整个控件,将其可见性设置为隐藏,然后从该控件中获取MouseDown

有什么建议吗?如果这个问题有什么不清楚的地方,请告诉我,我会解决的。

显示每个请求的示例代码

代码语言:javascript
复制
// 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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 16:20:56

您可以在PreviewMouseDown上注册Border事件。如果单击了包含元素,它也会触发。

代码语言:javascript
复制
private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
  var clickedElement = e.OriginalSource;
}
票数 3
EN

Stack Overflow用户

发布于 2015-11-04 17:28:20

还有一种方法(虽然不那么干净,海事组织),但是如果你需要一些自定义行为的话,它可能会很有用.也许:)

我们创建自定义滚动查看器,然后使用它而不是标准的滚动查看器,我们的自定义控件只会将它的鼠标向下事件传播给它的父控件(此示例过于简化,不适合在当前状态下用于生产)。

代码语言:javascript
复制
public class CustomScrollViewer : ScrollViewer
{
    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        ((e.Source as FrameworkElement).Parent as UIElement).RaiseEvent(e);
    }
}

对于像我这样对PreviewMouseDown方法不熟悉的人来说,它使用的是路由策略,称为隧道(从上到下),这与冒泡(从下到上)相反。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33526486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档