在我们的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”样式,但同样,这不是我们在运行它时所看到的。
答案 0 :(得分:0)
你的答案似乎在这里:
....您应该使用ItemsContainerStyle
而不是仅定义替换ItemTemplate
...并使用Style
定义您的BasedOn
以继承为其定义的默认样式您的FrameworkElement元素由主题。
您还可以使用其他一些技术来利用主题定义的默认样式(...只是为您提供额外的选项)。
还有一种上面没有涉及的技术,它使用标记扩展来合并一些样式(即你可以合并默认样式和你的风格)。
答案 1 :(得分:0)
您可以在BasedOn="{StaticResource {x:Type ItemType}}"
中使用Style
修改现有版本,但无法将默认模板的一部分与自定义模板合并,模板是单片的。