2013-08-05 5 views
0

Я хочу назначить новый DataTrigger программным способом (в коде/не xaml) для каждого стиля TreeViewItem, как это делается в следующем xaml.WPF - TreeView - Как программно извлечь стиль TreeViewItem (выбранный стиль)

Я сделал некоторый код (под xaml), где я определил свой триггер, но «ItemContainerStyle» имеет значение null. Функция вызывается при событии инициализации окна.

У кого-нибудь есть идея, что я делаю неправильно?

EDIT

я нашел какую-то часть моей проблемы: я переехал мой стиль из раздела «Ресурс» в разделе «ItemContainerStyle», как определено ниже в примере кода. Таким образом, стиль все еще применяется, и я могу получить доступ к стилю из свойства TReeView.ItemContainerStyle в коде. Но я до сих пор не знаю, как получить выбранный стиль TreeViewItem, как цвет фона по коду?

У меня есть XAML:

   <TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7" 
        ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto" 
        VerticalAlignment="Stretch" 
        VirtualizingStackPanel.IsVirtualizing="True" 
        VirtualizingStackPanel.VirtualizationMode="Recycling"> 
       <TreeView.Resources> 
        <Style TargetType="TreeViewItem"> 
         <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
           <!--<Setter Property="Background" Value="SlateBlue"></Setter>--> 
           <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 

У меня есть этот код:

public static void EnableMultipleSelection(TreeView treeView) 
    { 
     if (!_isMultiSelectTreeViewLeftButtonHandlerRegistered) 
     { 
      EventManager.RegisterClassHandler(typeof(TreeViewItem), UIElement.MouseDownEvent, 
                  new MouseButtonEventHandler(TreeViewMouseDownGlobal)); 
      _isMultiSelectTreeViewLeftButtonHandlerRegistered = true; 
     } 

     DataTrigger dataTrigger = new DataTrigger(); 
     dataTrigger.Binding = new Binding("IsHilighted"); 
     dataTrigger.Value = true; 
     dataTrigger.Setters.Add(new Setter(TreeViewItem.BackgroundProperty, new SolidColorBrush(Colors.Brown))); 

     treeView.ItemContainerStyle.Triggers.Add(dataTrigger); 

ред код:

<TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7" 
       ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto" 
       VerticalAlignment="Stretch" 
       VirtualizingStackPanel.IsVirtualizing="True" 
       VirtualizingStackPanel.VirtualizationMode="Recycling"> 

      <TreeView.ItemContainerStyle> 
       <Style TargetType="TreeViewItem"> 
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
          <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.Resources> 
       <!--<Style TargetType="TreeViewItem"> 
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
          <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style>--> 

ответ

0

Похоже, вы пытаетесь установить стиль. Слишком рано, прежде чем шаблон будет применен. Если вы примените триггер после того, как вы загрузили таргетинг FrameWorkElement, вы, вероятно, обнаружите, что ItemStyleContainer больше не является нулевым.

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx

Реализация OnApplyTemplate для вашего FrameworkElement должен зацепить вас после того, как в ItemStyleContainer было установлено, как это называется после Визуальное дерево было оказано.

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx

+0

Hi Ringer, спасибо. Я не совсем уверен, но я думаю, что все xaml должны были обрабатываться на «Инициализировано». Я стараюсь надеть «OnLoaded» без успеха. Я могу переопределить OnApplyTemplate, но я бы предпочел не делать этого, потому что хочу сохранить свой общий код. Вывод из TreeView повлияет на стандартное использование TreeView (мне придется создавать экземпляр собственного класса каждый раз, когда я хочу делать то, что я делаю сейчас). –

+0

Привет, Эрик, OnInitialized означает, что именно элемент прошел через конструктор, поэтому все свойства были инициализированы. Это не гарантирует, что все элементы визуального дерева будут визуализированы. См. Здесь в разделе Инициализированный второй абзац. http://msdn.microsoft.com/en-us/library/ms754221.aspx –

+0

Я только что сделал тест: using System.Diagnostics; с использованием System.Windows.Controls; пространство имен MultiSimAnalysis { \t общественного класса Test3: TreeView \t { \t \t публичного переопределение недействительными OnApplyTemplate() \t \t { \t \t \t базы.OnApplyTemplate(); \t \t \t Debug.Print (this.ItemContainerStyle.ToString()); \t \t} \t}} ... и используя TEST3 вместо TreeView в XAML, но я получаю тот же NullReferenceException. –

Смежные вопросы