#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
оно все равно было бы активным для внешнего элемента управления и фонового набора.