Отключить пузырящееся событие

#wpf

#wpf

Вопрос:

У меня такой стиль:

         <Style TargetType="{x:Type Expander}">
            <Setter Property="BorderBrush" Value="LightGray"/>
            <Setter Property="Margin" Value="5"/>

            <EventSetter Event="Mouse.MouseEnter" Handler="ExpanderMouseEnter"/>
            <EventSetter Event="Mouse.MouseLeave" Handler="ExpanderMouseLeave"/>
        </Style>
 

Когда я добавляю расширитель в качестве дочернего элемента в расширитель и наведите указатель мыши на дочерний расширитель, оба расширителя будут окрашены в серый цвет. Как я могу установить e.handled = true для события, чтобы оно не пузырилось?

РЕДАКТИРОВАТЬ: ХОРОШО, поэтому мне пришлось отредактировать стиль, чтобы вызвать кодовый метод. Вот методы:

 Private Sub ExpanderMouseEnter(ByVal sender As Expander, ByVal e As MouseEventArgs)
        sender.Background = Brushes.LightGray
        e.Handled = True
    End Sub

    Private Sub ExpanderMouseLeave(ByVal sender As Expander, ByVal e As MouseEventArgs)
        sender.Background = Brushes.White
        e.Handled = True
    End Sub
 

Но ничего не меняется.В чем проблема?

Ответ №1:

В идеале запись a Trigger для изменения фона с IsMouseDirectlyOver помощью флага должна работать, поскольку этот флаг предназначен для того, чтобы UIElements активировал триггеры ТОЛЬКО при наведении курсора мыши.

Но, похоже, это не работает для расширителей, потому что внутренний расширитель является частью визуального дерева внешнего расширителя.

Я полагаю, что вы могли бы подумать о том, чтобы иметь IsMouseOver триггер для Header элемента расширителей. Они взаимно исключают визуальное дерево друг друга. Поэтому, когда вы наведете курсор мыши на заголовки, расширители получат свой характерный цвет фона.

Комментарии:

1. Это работает для HeaderedContentControls, но в более общем плане не возникнет ли эта проблема с IsMouseDirectlyOver для произвольно вложенных элементов управления (например, кнопка внутри кнопки)?

Ответ №2:

Похоже, что это невозможно без использования кода, потому Trigger что ни EventTrigger один из них (который вы могли бы использовать в качестве альтернативы в этом сценарии) не предоставляет какой-либо соответствующей функциональности.

Если вы не сможете обойти проблему (например, применив стиль или его части только к дочерним расширителям), вам придется реализовать обработчик событий в коде и установить Handled свойство оттуда.

Ответ №3:

Я думаю, что реальная проблема заключается в том, что MouseLeave событие не запускается, когда мышь перемещается из внешнего расширителя во внутренний расширитель. В результате IsMouseOver свойство, используемое в вашем Triggers , остается установленным для обоих (как в вашем исходном вопросе). Таким образом, даже если бы вы могли установить Handled для свойства значение True при вводе мыши во второй расширитель, Trigger оно все равно было бы активным для внешнего элемента управления и фонового набора.