Как написать триггеры и сеттеры для TreeView через C #, а не XAML - PullRequest
0 голосов
/ 23 января 2012

Как добавить следующий триггер на основе 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 элемент

1 Ответ

0 голосов
/ 17 февраля 2012

Сделано, используя следующие операторы

SolidColorBrush colorBrush = новый SolidColorBrush (Colors.DodgerBlue); myTreeView.Resources.Add (SystemColors.ControlBrushKey, colorBrush);

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...