您好,我正在寻求您的帮助,因为我无法让我的'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重复代码?有人已经处于这种情况,并知道问题的原因吗?
感谢您的帮助, 阿诺。
答案 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>