嗨,我请求你的帮助,因为我无法使我的"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>