0

在我们的 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”样式,但同样,这不是我们在运行它时看到的。

4

2 回答 2

0

您的答案似乎在这里:

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

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

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

于 2012-08-26T13:39:45.030 回答
0

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

于 2012-08-26T14:57:22.840 回答