WPF基于带有Style.Resources的样式



嗨,我请求你的帮助,因为我无法使我的"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中合并了这本词典,如下所示:

App.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中的层次结构数据模板不起作用。MyBaseStyle的红色背景出现,DataTrigger工作正常,但模板工作不正常。程序似乎忽略了BasedOn样式的Style.Resources??

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

谢谢你的帮助,阿诺。

终于找到了解决方案
对于那些感兴趣的人,以下是详细信息。

我没有在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);
    }
}

选择器根据项的类型返回一个层次结构数据模板。这些模板位于(本例中)应用程序资源中:

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

相关内容

  • 没有找到相关文章