路线活动&的ScrollViewer

时间:2011-07-13 20:50:45

标签: c# .net wpf .net-4.0 routed-events

以下是我的元素树的组成方式(删除了无关的信息)。

<TabItem Style="Click_PutNormalCursorBack">
   <ScrollViewer>
      <ItemsControl Style="ContainsMuchLabels_n_CollapsibleGroupeHeaders">
         <Label Style="Click_ChangeCursor" />
      </ItemsControl>
   <ScrollViewer>
</TabItem>

我正在模拟Drag n Drop。当您点击可点击的标签时,它会变换您的光标,以便为您提供拖动它的印象。我想要的是点击TabItem,它会放回你的正常光标。

我无法使用PreviewMouseDown事件,因为它永远不会允许点击标签。

我找到的一个解决方案是在我的ScrollViewer和我的ItemsControl之间的元素树中添加一个大面板,带有透明背景以接收点击,将事件处理程序放在我的ItemsControl的CollapsibleGroupHeader ItemsPanel上但不是真是一个优雅的解决方案。

我在WPF中强调RoutedEvents以解决这类问题......

注意:我的处理程序不是我的风格,风格只是为了提供更多信息

这是一个比我更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

对两者使用MouseDown事件。如果事件不适用,请不要标记处理的事件(e.Handled = true)。例如,在可单击选项卡中,如果在光标未处于拖动状态时单击它,则不标记处理。一旦光标处于拖动状态,如果用户再次点击可点击标签,则不要标记处理(除非您希望该事件重置光标)。您还可以在选项卡上使用PreviewMouseDown事件,但除非该点击来自源自标签的光标,否则不要再标记处理。

如果您没有标记处理的事件,它会继续传播,因此多个控件可以处理它。即使某些事情标记了事件处理并且您仍然想要处理它,您甚至可以在标记处理时使事件触发:请参阅this article中的“添加即使事件被标记处理时引发的实例处理程序”