我有一个用户控件,它有一个注册的MouseDown事件处理程序。用户控件具有带有ItemsControl和TextBlock的ScrollViewer。 ItemsControl和TextBlock的可见性由MouseDown事件处理程序切换,因此一次只能看到其中一个。单击TextBlock而不是ItemsControl时,会正确调用eventhandler。
如果我将ItemsControl上的“IsHitTestVisible”设置为false,则视图的eventhandler会被暴露,但我无法滚动。
有人可以建议出路吗?
代码有点像这样:
<Grid>
<Border>
<ScrollViewer>
<TextBlock>
</ScrollViewer>
<Border>
<Border>
<Grid>
<ItemsControl/> <!-- Has a ScrollViewer in template to show scroll bar -->
</Grid>
<Border>
</Grid>
答案 0 :(得分:0)
您的UI场景听起来有点奇怪,但如果您仍想实现它,那么您可以执行以下操作。你没有为paren举起活动,因为ItemsControl将其标记为已处理,因此它不是routed further。您可以在父级中订阅PreviewMouseDown事件而不是MouseDown。然后,不管家长会在孩子面前收到通知。
<强>更新强>
您可以执行以下操作
<ScrollViewer>
<Grid MouseDown="HandleMouseDown">
<TextBlock />
<ItemsControl IsHitTestVisible="false"/>
</Grid>
</ScrollViewer>
因此,您将滚动文本块和项目。 ItemsControl自己的滚动条将不会被使用。
更新2
如果你想拥有单独的ScrollViewers,那么另一种可能性如下(虽然我认为一些边框和网格确实是不需要的。只有它们在你的代码片段中起作用)
<Grid>
<Border>
<ScrollViewer>
<TextBlock MouseDown="HandleMouseDown">
</ScrollViewer>
<Border>
<Border>
<Grid>
<ScrollViewer>
<Grid MouseDown="HandleMouseDown">
<ItemsControl IsHitTestVisible="false"/>
</Grid>
</ScrollViewer>
</Grid>
<Border>
</Grid>