我有一些DatTrigger
为ListView
项设置文字颜色。如果我将TextBox
用作ItemTemplate
作为ListView
,则效果非常好。但如果我使用TextBlock
,它就无效。
此代码:
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding Level,Mode=OneWay}"
Value="{x:Static Common:LoggingLevel.Error}">
<Setter Property="Foreground"
Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Level,Mode=OneWay}"
Value="{x:Static Common:LoggingLevel.Warning}">
<Setter Property="Foreground"
Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
...
<ListView ItemsSource="{Binding Entries}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Text,Mode=OneWay}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
生成正确颜色的消息列表。
这段代码:
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Level,Mode=OneWay}"
Value="{x:Static Common:LoggingLevel.Error}">
<Setter Property="Foreground"
Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Level,Mode=OneWay}"
Value="{x:Static Common:LoggingLevel.Warning}">
<Setter Property="Foreground"
Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
...
<ListView ItemsSource="{Binding Entries}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text,Mode=OneWay}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
使用默认的黑色前景色渲染所有消息。
答案 0 :(得分:4)
隐式样式在模板中应用于从System.Windows.Controls.Control
继承的元素,而TextBlock
直接从FrameworkElement
继承的元素将不适用。为了使其有效,您必须提供Style
x:Key
并明确指定样式TextBlock
或在TextBlock
中定义您的样式
更新:
为了涵盖这个主题,我还应该提一下,有一种方法可以将隐式Style
应用于所有TextBlocks
。如果您将其放在Application.Resources
中,它将适用于整个应用程序中的所有TextBlocks
。在这种情况下,它会导致一些主要的性能问题和可能的其他错误,这可能是微软决定保护这些基本元素不会意外地使用复杂的隐式样式的原因。并非所有人都意识到,您在Window
中看到的每一段文字基本上都是TextBlock
。
答案 1 :(得分:0)
提供Style
的密钥并将其应用于TextBlock
,如下所示:
<Style TargetType="TextBlock" x:Key="txtID">
<Style.Triggers>
<DataTrigger Binding="{Binding Level,Mode=OneWay}" Value="{x:Static Common:LoggingLevel.Error}">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Level,Mode=OneWay}" Value="{x:StaticCommon:LoggingLevel.Warning}">
<Setter Property="Foreground" Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
<ListView ItemsSource="{Binding Entries}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text,Mode=OneWay}" Style="{DynamicResource txtID}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>