为什么 DataTemplate 的触发器的 Setter.TargetName 属性 找不到 属性="Background" 的目标,但可以 属性="Panel.Background"
Why DataTemplate's Trigger's Setter.TargetName property cannot find target with Property="Background", but can with Property="Panel.Background"
我正在为 ListBox 的 ItemTemplate 实现一个模板,我有一个非常简单的编译错误,但我无法弄清楚它背后的原因。我想知道为什么 Property="Panel.Background"
和 Property="Background"
之间会有这种差异。第一个变体没有给出错误并且编译良好,而后者产生编译错误:
Error MC4111 Cannot find the Trigger target 'ContentBorder'. (The target must appear before any Setters, Triggers, or Conditions that use it.)
为什么DataTemplate 的Trigger 的Setter.TargetName 属性 无法通过Property="Background"
找到目标,但可以通过Property="Panel.Background"
找到目标?我没有更改触发器在 VisualTree 中的位置(如:我没有将触发器进一步向下移动到树中)。
抱歉,如果这个问题已经在其他地方得到了回答;我做了我的研究,但没有找到任何与我提出的问题和结果具体相关的答案。
下面是重现此案例的完整XAML。
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="ContentBorder" Value="DarkTurquoise" />
</Trigger>
</DataTemplate.Triggers>
<Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
<Border.Background>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Offset="0" Color="Gray"/>
<GradientStop Offset="1" Color="Black"/>
</LinearGradientBrush>
</Border.Background>
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Offset="0" Color="Black"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Border.BorderBrush>
<Grid>
<Grid.Resources>
<ResourceDictionary>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="3" />
<Setter Property="Foreground" Value="White"/>
</Style>
</ResourceDictionary>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" SharedSizeGroup="Items" />
<ColumnDefinition Width="*" SharedSizeGroup="Items" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding StartTime, StringFormat={}Start time: {0:dd.MM.yyyy hh:mm:ss}}" />
<TextBlock
Grid.Row="0" Grid.Column="1" Text="{Binding SportTypeId, Converter={x:Static Converters:SportTypeCodeToTextConverter.Instance}}"
FontWeight="Bold" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Distance, StringFormat={}Distance: {0}}" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Duration, StringFormat={}Duration: {0:hh\:mm\:ss}}" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>```
据我所知,指定模板及其触发器的顺序很重要。
试试这个:
<DataTemplate>
<Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
<!--Filling in the template-->
</Border>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="DarkTurquoise" TargetName="ContentBorder"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
为了以防万一,Border 从 Control 继承了 Background。
因此,属性的全称是Control.Background,而不是Panel.Background。
我正在为 ListBox 的 ItemTemplate 实现一个模板,我有一个非常简单的编译错误,但我无法弄清楚它背后的原因。我想知道为什么 Property="Panel.Background"
和 Property="Background"
之间会有这种差异。第一个变体没有给出错误并且编译良好,而后者产生编译错误:
Error MC4111 Cannot find the Trigger target 'ContentBorder'. (The target must appear before any Setters, Triggers, or Conditions that use it.)
为什么DataTemplate 的Trigger 的Setter.TargetName 属性 无法通过Property="Background"
找到目标,但可以通过Property="Panel.Background"
找到目标?我没有更改触发器在 VisualTree 中的位置(如:我没有将触发器进一步向下移动到树中)。
抱歉,如果这个问题已经在其他地方得到了回答;我做了我的研究,但没有找到任何与我提出的问题和结果具体相关的答案。
下面是重现此案例的完整XAML。
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="ContentBorder" Value="DarkTurquoise" />
</Trigger>
</DataTemplate.Triggers>
<Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
<Border.Background>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Offset="0" Color="Gray"/>
<GradientStop Offset="1" Color="Black"/>
</LinearGradientBrush>
</Border.Background>
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Offset="0" Color="Black"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Border.BorderBrush>
<Grid>
<Grid.Resources>
<ResourceDictionary>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="3" />
<Setter Property="Foreground" Value="White"/>
</Style>
</ResourceDictionary>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" SharedSizeGroup="Items" />
<ColumnDefinition Width="*" SharedSizeGroup="Items" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding StartTime, StringFormat={}Start time: {0:dd.MM.yyyy hh:mm:ss}}" />
<TextBlock
Grid.Row="0" Grid.Column="1" Text="{Binding SportTypeId, Converter={x:Static Converters:SportTypeCodeToTextConverter.Instance}}"
FontWeight="Bold" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Distance, StringFormat={}Distance: {0}}" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Duration, StringFormat={}Duration: {0:hh\:mm\:ss}}" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>```
据我所知,指定模板及其触发器的顺序很重要。 试试这个:
<DataTemplate>
<Border BorderThickness="1" CornerRadius="10" x:Name="ContentBorder">
<!--Filling in the template-->
</Border>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="DarkTurquoise" TargetName="ContentBorder"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
为了以防万一,Border 从 Control 继承了 Background。
因此,属性的全称是Control.Background,而不是Panel.Background。