微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PreviewMouseDown不能按预期进行隧道化

如何解决PreviewMouseDown不能按预期进行隧道化

| 我的应用程序上有以下树:
MainWindow (Window)
> LayoutRoot (Grid)
  > (MyCustomControl)
    > Item1 (Grid)
      > Button (Button1)
MyCustomControl派生自ItemsControl,并将其项目显示在StackPanel上。 MyCustomControl需要知道何时在其内部单击鼠标,因此我已经重写了OnPreviewMouseDown方法,并希望在控件内按下任何鼠标时得到通知。 发生了什么:如果我在Button1内单击,则PreviewMouseDown事件沿树传播,并且按预期执行OnPreviewMouseDown。但是,如果我单击Item1,则PreviewMouseDown事件将在MainWindow之后停止,甚至不会到达LayoutRoot。 以下是我使用Snoop获得的路由事件详细信息: 单击Button1:
(Window)
> (Border)
  > (AdornerDecorator)
    > (ContentPresenter)
      > LayoutRoot (Grid)
        > (MyCustomControl)
          > (Border)
            > (StackPanel)
              > Item1 (Grid)
                > Button1 (Button)
                  > Chrome (ButtonChrome)
单击项目1:
(Window)
> (Border)
该事件从未被报告为已处理,因此据我所知它应该继续进行隧道传输。 我在这里想念什么?     

解决方法

        您将需要确保您的自定义控件是可测试的。如果您有一个类似的ControlTemplate:
<ControlTemplate>
    <ItemsPresenter />
</ControlTemplate>
这样,您的自定义控件本身就无法进行点击测试。即使您有一个类似的ControlTemplate:
<ControlTemplate>
    <Border Background=\"{TemplateBinding Background}\" ...>
        <ItemsPresenter />
    </Border>
</ControlTemplate>
然后,如果Background为null,则您的控件本身将不会被进行命中测试。如果仅将Background属性设置为Transparent,则可以进行点击测试。 经验法则是,如果控件或其后代之一未在给定位置(即像素)呈现某些内容,即使它是“透明”的,则鼠标也不会为其注册事件。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。