根据 属性 选择样式
Choose Style depending on property
是否可以在同一控件上的 DataTrigger
中设置 Style
属性(例如 Button
的)?
我想将我的 Default-、MouseOver- 和 Selected-Styles 定义为资源,以便稍后重用它们。然而,处理 MouseOver(和其他)事件似乎通常是通过在 DataTrigger
中单独设置更改的属性来完成的,而不是将新的 Style
分配给控件(这是有道理的,因为数据触发器将被删除指定另一种样式)。
您可以使用 DataTamplates 完成这样的事情:
<Window x:Class="StackSimpleSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<Style x:Key="RedStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
</Style>
<Style x:Key="GreenStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
<DataTemplate x:Key="DefaultDataTemplate">
<TextBlock Text="TestColor" Style="{StaticResource RedStyle}" HorizontalAlignment="Center"/>
</DataTemplate>
<DataTemplate x:Key="OnMouseOverDataTemplate">
<TextBlock Text="TestColor" Style="{StaticResource GreenStyle}" HorizontalAlignment="Center"/>
</DataTemplate>
<Style x:Key="StyleDefault" TargetType="{x:Type ContentPresenter}">
<Setter Property="ContentTemplate" Value="{DynamicResource DefaultDataTemplate}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource OnMouseOverDataTemplate }"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Grid>
<ContentPresenter Style="{DynamicResource StyleDefault}" Content="{Binding}" />
</Grid>
</Grid>
</Window>
试一试。您基本上使用的是 Style
,它将根据 IsMouseOver
事件更改两个 ContentTemplates
。
是否可以在同一控件上的 DataTrigger
中设置 Style
属性(例如 Button
的)?
我想将我的 Default-、MouseOver- 和 Selected-Styles 定义为资源,以便稍后重用它们。然而,处理 MouseOver(和其他)事件似乎通常是通过在 DataTrigger
中单独设置更改的属性来完成的,而不是将新的 Style
分配给控件(这是有道理的,因为数据触发器将被删除指定另一种样式)。
您可以使用 DataTamplates 完成这样的事情:
<Window x:Class="StackSimpleSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<Style x:Key="RedStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
</Style>
<Style x:Key="GreenStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
<DataTemplate x:Key="DefaultDataTemplate">
<TextBlock Text="TestColor" Style="{StaticResource RedStyle}" HorizontalAlignment="Center"/>
</DataTemplate>
<DataTemplate x:Key="OnMouseOverDataTemplate">
<TextBlock Text="TestColor" Style="{StaticResource GreenStyle}" HorizontalAlignment="Center"/>
</DataTemplate>
<Style x:Key="StyleDefault" TargetType="{x:Type ContentPresenter}">
<Setter Property="ContentTemplate" Value="{DynamicResource DefaultDataTemplate}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource OnMouseOverDataTemplate }"/>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Grid>
<ContentPresenter Style="{DynamicResource StyleDefault}" Content="{Binding}" />
</Grid>
</Grid>
</Window>
试一试。您基本上使用的是 Style
,它将根据 IsMouseOver
事件更改两个 ContentTemplates
。