WPF BasedOn Style with Style.Resources

时间:2013-08-13 23:39:48

标签: wpf dictionary resources styles

您好,我正在寻求您的帮助,因为我无法让我的'BasedOn'风格正常工作。情况如下:

我在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}" />

但是因为我的应用程序中有多个TreeView,我需要将MyBaseStyle应用于它们,并为每个TreeView添加不同的DataTrigger。我试过这个:

  

MainWindow.xaml

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

问题是MyBaseStyle中的HierarchicalDataTemplate不起作用。出现MyBaseStyle的红色背景,DataTrigger工作正常,但不是模板。似乎该程序忽略了BasedOn样式的Style.Resources ??

我认为这可能是一个样式范围问题,但是如何解决它,而不必为每个TreeView重复代码?有人已经处于这种情况,并知道问题的原因吗?

感谢您的帮助, 阿诺。

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案 对于那些感兴趣的人,这里有详细信息。

我没有使用带Style.Resources的Style,而是为每个TreeView设置了ItemTemplateSelector属性:

<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,具体取决于项的类型。这些模板位于(在本例中)应用程序资源中:

<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>