Установка шрифта родителя в узлах в WPF Tree View для Bold с использованием кода позади - PullRequest
0 голосов
/ 20 декабря 2010

Я сделал древовидное представление и добавил к нему родительские и дочерние узлы, используя код позади, теперь я застрял в том, чтобы установить шрифт родительских узлов на BOLD, сохраняя шрифт дочернего элемента таким, какой он есть, ниже.это код, который у меня есть прямо сейчас.

List<ParentTreeViewNode> ParentTreeViewNodeList = new List<ParentTreeViewNode>();

HierarchicalDataTemplate treeViewTemplate = new HierarchicalDataTemplate(typeof(Child));
treeViewTemplate.DataType = "{x:Type local:Child}";
treeViewTemplate.ItemsSource = new Binding("Children");

FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetBinding(TextBlock.TextProperty, new Binding("Name"));
tb.SetValue(TextBlock.ForegroundProperty, Brushes.Yellow);
treeViewTemplate.VisualTree = tb;

DataTemplate parentTemplate = new DataTemplate(typeof(ParentTreeViewNode));
parentTemplate.DataType = "{x:Type local:ParentTreeViewNode}";
//parentTemplate.ItemsSource = new Binding("Children");

FrameworkElementFactory tbp = new FrameworkElementFactory(typeof(TextBlock));
tbp.SetBinding(TextBlock.TextProperty, new Binding("Name"));
tbp.SetValue(TextBlock.ForegroundProperty, Brushes.Green);
treeViewTemplate.VisualTree = tbp;


// ParentTreeViewNode1.Children = Childlist1;

ParentTreeViewNodeList.Add(new ParentTreeViewNode("Paren1"));
ParentTreeViewNodeList.Add(new ParentTreeViewNode("Paren2"));
ParentTreeViewNodeList.Add(new ParentTreeViewNode("Paren3"));

//arrayTreeView.ItemTemplate = treeViewTemplate;
arrayTreeView.Resources.Add(1,treeViewTemplate);
arrayTreeView.Resources.Add(2,treeViewTemplate);
arrayTreeView.ItemsSource = ParentTreeViewNodeList;  

это ссылка, по которой я получил помощь: http://zamjad.wordpress.com/2009/12/06/using-hierarchical-data-template-with-c-code/#comment-446

спасибо

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Я не могу сказать вам, как исправить этот код для этого. Что я могу сделать, так это сказать вам, что вам не нужен кодовый код для этого. Это похоже на кошмар.

Вот простой пример того, как использовать привязку, стиль и триггер для выполнения того, о чем вы говорите. Не слишком волнуйтесь из-за того, что я здесь использую XmlDataProvider - это просто рабочий пример, который вы можете вставить в Kaxaml и поиграть с ним. Когда я говорю «просто», я имею в виду, что все это достигается за счет единого связывания, единого шаблона и единого стиля.

Ключевым моментом здесь является то, что стиль в HierarchicalDataTemplate устанавливает FontWeight на Bold по умолчанию, а затем DataTrigger устанавливает его на Normal, если элемент не имеет дочерних элементов. (Поэтому, когда вы раскроете дерево, вы заметите, что тот факт, что элемент выделен жирным шрифтом, говорит о том, что у него есть дети. Это выглядит довольно мило.)

Если вы привязываетесь к чему-то другому, чем XmlDataSource, у вас, вероятно, есть свойство в источнике, которое DataTrigger может проверить, со значением, которое говорит вам, является ли он дочерним или нет; просто вставьте это свойство и значение в стиль.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="Data">
      <x:XData>
        <Data xmlns="">
          <Parent Text="This is a parent">
            <Child Text="This is a child"/>
            <Child Text="This is a child">
              <Grandchild Text="This is a grandchild"/>
              <Grandchild Text="This is a grandchild"/>
            </Child>
            <Child Text="This is a child"/>
          </Parent>
          <Parent Text="This is a parent">
            <Child Text="This is a child"/>
            <Child Text="This is a child"/>
            <Child Text="This is a child"/>
          </Parent>
        </Data>
      </x:XData>
    </XmlDataProvider>
  </Page.Resources>
  <DockPanel>  
    <TreeView DockPanel.Dock="Top" ItemsSource="{Binding Source={StaticResource Data}, XPath=/Data/*}">
      <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding XPath=*}">
          <TextBlock Text="{Binding XPath=@Text}">
            <TextBlock.Style>
              <Style TargetType="TextBlock">
                <Setter Property="FontWeight" Value="Bold"/>
                <Style.Triggers>
                  <DataTrigger Binding="{Binding XPath=*}" Value="{x:Null}">
                    <Setter Property="FontWeight" Value="Normal"/>
                  </DataTrigger>
                </Style.Triggers>
              </Style>
            </TextBlock.Style>
          </TextBlock>
        </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>
  </DockPanel>
</Page>
2 голосов
/ 20 декабря 2010

Вы должны указать что-то вроде этого:

tb.SetValue(TextBlock.FontWeightProperty, FontWeights.Bold);

или

tb.SetValue(TextBlock.FontWeightProperty, FontWeights.Normal);

, если считаете нужным

1 голос
/ 20 декабря 2010

Попробуйте это

  <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Grid>
                        --------------
                        --------------
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="true">
                            <Setter TargetName="PART_Header"
                                    Property=" TextElement.FontWeight"
                                    Value="Bold"/>
                        </Trigger>                           
                    </ControlTemplate.Triggers>
                </ControlTemplate>

Скопируйте шаблон по умолчанию и добавьте этот триггер. Я не уверен, как это сделать в коде. Вы можете проверить эту статью, чтобы получить некоторый обзор

http://www.codeproject.com/KB/buttons/ButtonControl.aspx

...