【问题标题】:Allowing a subset of mouse messages to pass through a control in WPF允许鼠标消息的子集通过 WPF 中的控件
【发布时间】:2017-01-09 22:26:40
【问题描述】:

假设我在 XAML 中有两个元素。出于说明目的,假设我有一个列表视图和一个网格。像这样:

<ListView Name="MyList> />
<Grid Name="MyGrid" Background="#80FF0000"/>

我使用网格在列表视图的顶部放置一个大的红色半透明叠加层(即网格在 Z 顺序中较高)。

现在,这种安排意味着网格将阻止鼠标消息进入底层列表视图,这正是我想要的......而且效果很好。

但意想不到的结果是网格也会阻止列表视图接收鼠标滚轮消息,这不是我想要的。

所以我想知道是否可以摆弄网格的命中测试以允许鼠标消息通过到底层列表视图但仍然阻止右/左单击,拖动滴等。

或者,是否可以在网格上预览鼠标滚轮消息并将它们“转发”到底层列表视图?

我对任何 xaml 或代码隐藏解决方案都很满意。 (我发誓我以前也这样做过,但对于我的一生来说,我似乎无法找到一个简单的方法)。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    我不知道有一种方法可以使某些鼠标事件可以测试,而另一些则不能——这就是您当前的安排必须要做的事情。但是,如果ListViewGrid 的子级,您将能够利用路由事件来实现您想要的行为。在这种情况下,您需要更改ListView 而不是Grid 的不透明度。最终用户不会更聪明 - 它仍然应该看起来像 ListView 顶部的半透明覆盖层。

    <Grid Name="MyGrid" 
          Background="#FFFF0000">
        <ListView Name="MyList" 
                  Opacity="0.5" />
    </Grid>
    

    然后在后面的代码中,如果您让“MyGrid”处理PreviewMouseDown 事件,这将防止MouseDown 事件冒泡到“MyList”,但仍允许MouseWheel 事件通过。

    this.MyGrid.PreviewMouseDown += (o, e) =>
    {
        e.Handled = true;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多