1

这是我的元素树的组成方式(删除了不相关的信息)。

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

我正在模拟拖放。当你点击可点击的标签时,它会改变你的光标,给你拖动它的印象。我想要的是点击 TabItem,它会放回你的正常光标。

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

我发现的一个解决方案是在我的 ScrollViewer 和我的 ItemsControl 之间的元素树中添加一个大面板,具有透明背景以接收点击,在我的 ItemsControl 的 CollapsibleGroupHeaderItemsPanel 上放置一个事件处理程序,但这并不是一个真正优雅的解决方案。

我在 WPF 中使用 RoutedEvents 来解决这类问题......

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

有比我更好的解决方案吗?

4

1 回答 1

1

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

如果您不将事件标记为已处理,它将继续传播,以便多个控件可以处理它。即使某些事情确实将事件标记为已处理并且您仍想处理它,即使标记为已处理,您也可以触发事件:请参阅本文中的“添加即使事件标记为已处理也会引发的实例处理程序

于 2011-07-13T20:57:49.017 回答