2017-01-09 59 views
3

可以说我在XAML中有两个元素。为了说明的目的,可以说我有一个列表视图和一个网格。就像这样:允许鼠标消息的子集通过WPF中的控件

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

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

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

但意想不到的结果是,网格还会阻止listview接收鼠标滚轮消息,这不是我想要的。

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

或者,是否有可能在网格上预览mousewheel消息并将它们转发到底层的listview?

我对任何xaml或代码隐藏解决方案感到满意。 (我发誓我以前做过这件事,但对于我的生活,我似乎无法找出一个简单的方法)。

回答

0

我不知道有什么方法可以使某些鼠标事件触及可测试,而其他鼠标事件不会触发 - 这与您当前的安排无关。但是,如果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; 
};