Как добавить следующий триггер на основе XAML в TreeView из кода позади, а не из XAML.
<TreeView>
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Menu Item 1" />
<MenuItem Header="Menu Item 2" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
<TreeViewItem Header="Item 1">
<TreeViewItem Header="Sub-Item 1"/>
</TreeViewItem>
<TreeViewItem Header="Item 2"></TreeViewItem>
</TreeView>
Поведение WPF по умолчанию - изменять TreeViewItem на серый, когда открывается ContextMenu, но, как и практически все остальное в WPFВы можете переопределить это:
Создать прикрепленное свойство ContextMenuOpened В стиле TreeViewItem, привязать ContextMenuOpened к «ContextMenu.IsOpen». Добавить триггер, который меняет кисть, когда ContextMenuOpened и IsSelected оба являются истинными.*
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>
Все деревья в моем приложении создаются во время выполнения с помощью кода C #.Я хочу выполнить всю описанную выше работу с помощью кода C #, поскольку создал дерево во время выполнения, используя следующий код
TreeView _objTreeView = new TreeView();
Справочный вопрос: Элемент контекстного меню WPF TreeViewItem Unhighlights элемент