2013-08-13 7 views
2

Привет, я прошу вас о помощи, поскольку я не могу заставить свой стиль BasedOn работать правильно. Вот ситуация:WPF BasedOn Style with Style.Resources

Я свой базовый стиль определен в ResourceDictionary, как это:

Styles.xaml

<Style TargetType="{x:Type TreeView}" x:Key="MyBaseStyle"> 
<Style.Resources> 
    <HierarchicalDataTemplate ...> 
     ... 
    </HierarchicalDataTemplate> 
    <DataTemplate ...> 
     ... 
    </DataTemplate> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     ... 
    </Style> 
</Style.Resources> 
<!-- This is for test purpose --> 
<Setter Property="Background" Value="Red" /> 

я сливаю этот словарь в мой App.xaml:

App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Styles.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Вот что я делал раньше, что работал отлично, в моем главном окне:

MainWindow.xaml

<TreeView ... Style="{StaticResource MyBaseStyle}" /> 

Но поскольку у меня есть несколько TreeViews в моем приложении, мне нужно применить к ним MyBaseStyle и добавить DataTrigger для каждого TreeV МЭН. Я попытался это:

MainWindow.xaml

<TreeView ...> 
    <TreeView.Style> 
     <Style TargetType="{x:Type TreeView}" BasedOn="{StaticResource MyBaseStyle}"> 
      <Style.Triggers> 
       <!-- DataTrigger here --> 
      </Style.Triggers> 
     </Style> 
    </TreeView.Style> 
</TreeView> 

Проблема заключается в том, что HierarchicalDataTemplate в MyBaseStyle не работает. Появляется красный фон MyBaseStyle, и DataTrigger работает отлично, но не шаблон. Кажется, что программа игнорирует стиль. Ресурсы стиля BasedOn?

Я думаю, что это может быть проблема с областью стиля, но как я могу ее решить, не повторяя код для каждого TreeView? Кто-то уже был в этой ситуации и знает причину проблемы?

Благодарим за помощь, Arnaud.

+1

Что делать, если вы переместили 'Style' из' '' в ' –

+0

Хорошая попытка, но все еще не работает :-) –

ответ

0

И, наконец, нашли решение.
Для интересующихся, вот подробности.

Вместо того, чтобы использовать стиль с Style.Resources я установить свойство ItemTemplateSelector для каждого TreeView:

<TreeView x:Name="treeView1" ItemsSource="..." ItemTemplateSelector="{StaticResource selector}" /> 
... 
<TreeView x:Name="treeView2" ItemsSource="..." ItemTemplateSelector="{StaticResource selector}" /> 

, который присутствует в окне ресурсов:

<Window.Resources> 
    <local:Selector x:Key="selector" /> 
</Window.Resources> 

и реализована следующим образом:

public class Selector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item is TreeDirectory) return Application.Current.FindResource("dirTemplate") as HierarchicalDataTemplate; 
     if (item is TreeFile) return Application.Current.FindResource("fileTemplate") as HierarchicalDataTemplate; 
     return base.SelectTemplate(item, container); 
    } 
} 

Селектор возвращает HierarchicalDataTemplate, в зависимости от th e тип элемента.Эти шаблоны расположены (в данном случае) в ресурсах приложения:

<Application.Resources> 
    <HierarchicalDataTemplate x:Key="dirTemplate" DataType="{x:Type local:TreeDirectory}" ItemsSource="{Binding Children}"> 
     <TextBlock Foreground="Red" Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="fileTemplate" DataType="{x:Type local:TreeFile}"> 
     <TextBlock Foreground="Green" Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</Application.Resources> 
Смежные вопросы