C# 数据触发器可用于TextBox,但不可用于TextBlock?
我有一些C# 数据触发器可用于TextBox,但不可用于TextBlock?,c#,wpf,xaml,datatrigger,C#,Wpf,Xaml,Datatrigger,我有一些DatTriggers设置ListView项目的文本颜色。如果我将TextBox用作ItemTemplate用于列表视图,它将非常有效。但是如果我使用TextBlock,它就不起作用了 此代码: <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding Level,Mode=OneWay}" Val
DatTrigger
s设置ListView
项目的文本颜色。如果我将TextBox
用作ItemTemplate
用于列表视图
,它将非常有效。但是如果我使用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>
...
以默认的黑色前景色呈现所有邮件。隐式样式在模板中应用于继承自
System.Windows.Controls.Control
的元素,并且由于TextBlock
直接继承自FrameworkElement
,因此不会应用。要使其正常工作,您必须给出样式x:Key
,并将样式显式分配给文本块
,或在文本块
中定义样式
更新:
为了涵盖本主题,我还应该提到,有一种方法可以将隐式样式
应用于所有文本块
。如果您将它放在Application.Resources
中,它将应用于整个应用程序中的所有TextBlocks
。在这种情况下,它将导致一些主要的性能问题和潜在的其他错误,这可能就是为什么Microsoft决定保护这些基本元素,使其不会意外地使用复杂的隐式样式。并非所有人都意识到,基本上,您在窗口中看到的每一段文本最终都会成为TextBlock
隐式样式应用于模板中继承自System.Windows.Controls.Control
的元素,因为TextBlock
直接继承自FrameworkElement
它不适用。要使其正常工作,您必须给出样式x:Key
,并将样式显式分配给文本块
,或在文本块
中定义样式
更新:
为了涵盖本主题,我还应该提到,有一种方法可以将隐式样式
应用于所有文本块
。如果您将它放在Application.Resources
中,它将应用于整个应用程序中的所有TextBlocks
。在这种情况下,它将导致一些主要的性能问题和潜在的其他错误,这可能就是为什么Microsoft决定保护这些基本元素,使其不会意外地使用复杂的隐式样式。并非所有人都意识到,您在窗口中看到的每一段文本基本上都以TextBlock
结尾,提供样式的键,并将其应用于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>
提供样式的键
,并将其与文本块一起应用,如下所示:
<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>