2

您好,我正在寻求您的帮助,因为我无法让我的“BasedOn”风格正常工作。这是情况:

我在 ResourceDictionary 中定义了我的基本样式,如下所示:

样式.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 中,如下所示:

应用程序.xaml

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

这是我之前所做的,在我的主窗口中效果很好:

主窗口.xaml

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

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

主窗口.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 重复代码?有人已经遇到过这种情况,知道问题的原因吗?

谢谢你的帮助,阿诺。

4

1 回答 1

0

终于找到了解决办法。
对于那些感兴趣的人,这里是详细信息。

我没有将 Style 与 Style.Resources 一起使用,而是为每个 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>
于 2013-08-14T18:44:00.417 回答