如何访问主题的默认样式?

时间:2012-08-26 06:38:02

标签: wpf controltemplate theming

在我们的WPF应用程序中,我们有一个自定义列表框,当没有样式时,会匹配默认的Windows主题,例如突出显示的,悬停的或选定的项目(即漂亮的蓝色半透明渐变)。

但是,当我们尝试创建自己的ListBoxItem模板并使用此代码中的值时......

<Trigger Property="Selector.IsSelected" Value="True">
    <Setter TargetName="Bd" Property="Panel.Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    <Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
</Trigger>

...控件丢失了所有Aero主题的痕迹,恢复到旧的Win95 / Classic外观。我们怎么能说'嘿......将主题'突出'的风格应用到我们的边境。'?

同样,在我们重新模板化控件之前,资源显然已经加载,但是我们应该如何访问主题的内置样式?毕竟,'选择'外观到处都是...... ListBox,ComboBox,ListView,无处不在。我们只是想控制它而不必重新发明轮子。

注意:我们使用ShowMeTheTemplate.exe应用程序来获取默认的“Aero”样式,但同样,这不是我们在运行它时所看到的。

2 个答案:

答案 0 :(得分:0)

你的答案似乎在这里:

....您应该使用ItemsContainerStyle而不是仅定义替换ItemTemplate ...并使用Style定义您的BasedOn以继承为其定义的默认样式您的FrameworkElement元素由主题。

您还可以使用其他一些技术来利用主题定义的默认样式(...只是为您提供额外的选项)。

还有一种上面没有涉及的技术,它使用标记扩展来合并一些样式(即你可以合并默认样式和你的风格)。

答案 1 :(得分:0)

您可以在BasedOn="{StaticResource {x:Type ItemType}}"中使用Style修改现有版本,但无法将默认模板的一部分与自定义模板合并,模板是单片的。