Поведение WPF по умолчанию при открытии ContextMenu меняет TreeViewItem на серый, но, как и практически все остальное в WPF, вы можете переопределить это:
- Создать вложенное свойство ContextMenuOpened
- В стиле TreeViewItem, связать ContextMenuOpened с "ContextMenu.IsOpen"
- Добавить триггер, который изменяет кисть, когда ContextMenuOpened и IsSelected имеют значение true
Вот прикрепленное свойство:
public class TreeViewCustomizer : DependencyObject
{
public static bool GetContextMenuOpened(DependencyObject obj) { return (bool)obj.GetValue(ContextMenuOpenedProperty); }
public static void SetContextMenuOpened(DependencyObject obj, bool value) { obj.SetValue(ContextMenuOpenedProperty, value); }
public static readonly DependencyProperty ContextMenuOpenedProperty = DependencyProperty.RegisterAttached("ContextMenuOpened", typeof(bool), typeof(TreeViewCustomizer));
}
Вот сеттер в стиле:
<Setter Property="my:TreeViewCustomizer.ContextMenuOpened"
Value="{Binding ContextMenu.IsOpen, RelativeSource={RelativeSource Self}}" />
Вот триггер:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="my:TreeViewCustomizer.ContextMenuOpened" Value="true"/>
</MultiTrigger.Conditions>
<Setter TargetName="Bd"
Property="Background"
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</MultiTrigger>
Как это работает: Каждый раз, когда ContextMenu открывается, устанавливается свойство IsOpen. Привязка приводит к тому, что ваше присоединенное свойство устанавливается в TreeViewItem. Это, в сочетании с IsSelected, вызывает триггер, который изменяет цвета переднего плана и фона, чтобы сделать элемент по-прежнему выделенным.