这个问题与Change WPF DataTemplate...非常相似,我已阅读并实施了该问题。它起初很漂亮,但我遇到了问题。
问题在于,当您在应用程序中使用主题(例如WPF Futures project中的主题时)(例如Expression Dark),ListBoxItems都会恢复为默认的WPF样式。这打破了这些元素的主题,例如,在黑色背景上生成黑色文本,否则文本将为白色。这也影响了我的TreeView,可能会影响其他类似的控件。
我认为这是因为为ListBox.ItemContainerStyle设置了冲突的样式 - 一个来自主题,另一个用于切换数据模板。
我四处寻找其他解决方案,但还没有找到任何解决方案。以下是我迄今为止的主要观点或想法:
这是我的ListBox和相关部分:
<Window.Resources>
<DataTemplate x:Key="NormalTemplate">
...
</DataTemplate>
<DataTemplate x:Key="SelectedTemplate">
...
</DataTemplate>
</Window.Resources>
<ListBox x:Name="RegisterListBox" Grid.Row="0"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Adjustments}">
<!-- this is from the post referenced above -->
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate" Value="{StaticResource NormalTemplate}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
在代码中设置Listbox.DataContext以启用ItemsSource绑定。
我是如何在保持对主题的无缝支持的同时实现上述功能的?
答案 0 :(得分:5)
你尝试过这样的事吗?
<ListBox.ItemContainerStyle>
<Style
TargetType="{x:Type ListBoxItem}"
BasedOn="{StaticResource {x:Type ListBoxItem}}"> <=====
...
这个想法是框架首先会找到一个等于typeof(ListBoxItem)
的键的样式,它会在主题中找到它,然后你的样式只会扩展主题的样式和你的具体细节。