Routed Events & ScrollViewer - PullRequest
       11

Routed Events & ScrollViewer

1 голос
/ 14 июля 2011

Вот как составляется мое дерево элементов (ненужная информация удалена).

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

Я моделирую Drag n Drop.Когда вы нажимаете на кликабельную метку, она превращает ваш курсор, чтобы создать впечатление, как вы его перетаскиваете.Я хочу, чтобы щелкнув TabItem, он вернул ваш обычный курсор.

Я не могу использовать событие PreviewMouseDown, поскольку оно никогда не позволит щелкнуть метку.

Одно решение, которое я нашел, былодобавление большой панели к моему дереву элементов между моим ScrollViewer и моим ItemsControl с прозрачным фоном для получения кликов, добавление обработчика событий в CollapsibleGroupHeader моего ItemsControl и ItemsPanel, но это не совсем элегантное решение.

У меня жесткие RoutedEvents в WPF, где они решают подобные проблемы ...

Примечание: мои обработчики - это не мои стили, стили, где просто для получения дополнительной информации

Это лучшее решение, чем мое?

1 Ответ

1 голос
/ 14 июля 2011

Используйте событие MouseDown для обоих.Просто не отмечайте событие как обработанное (e.Handled = true), если событие не применяется.Например, если вы щелкаете по вкладке, на которую можно кликнуть, когда курсор не находится в состоянии перетаскивания, не помечайте его как обработанный.Когда курсор находится в состоянии перетаскивания, и если пользователь снова нажимает на активируемую метку, не помечайте обработанный (если вы не хотите, чтобы это событие сбрасывало курсор).Вы также можете использовать событие PreviewMouseDown на вкладке, но опять же не отмечать обработанный, если этот щелчок не от курсора, который исходит от метки.

Если вы не отметите обработанное событие, оно продолжает распространятьсятак что несколько элементов управления могут справиться с этим.Даже если что-то помечает событие как обработанное, и вы все равно хотите его обработать, вы можете запустить событие даже при помеченной обработке: см. «Добавление обработчиков экземпляров, которые возникают даже при обработке событий» в этой статье

...