gpt4 book ai didi

Wpf:Storyboard.TargetName 有效,但 Setter TargetName 无效

转载 作者:行者123 更新时间:2023-12-04 14:06:58 24 4
gpt4 key购买 nike

假设我们有一个这样的 XAML 代码:

<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border HorizontalAlignment="Center" VerticalAlignment="Center">
<Border.LayoutTransform>
<!--We are rotating randomly each image. Selected one will be rotated to 45°.-->
<RotateTransform Angle="{Binding RandomAngle}" x:Name="globalRotation"/>
</Border.LayoutTransform>
<Grid>
<Image Source="{Binding ImageLocation}" Stretch="None" />
<TextBlock x:Name="title" Text="{Binding Title}" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="title" Property="Visibility" Value="Visible"/>
<!--The next line will not compile.-->
<Setter TargetName="globalRotation" Property="Angle" Value="45"/>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<!--This compiles well.-->
<DoubleAnimation Storyboard.TargetName="globalRotation" Storyboard.TargetProperty="Angle" To="45" Duration="00:00:03"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

此代码旨在在列表框中显示一组图像。每个图像都有随机旋转,但选择时,旋转到45度。

通过 Storyboard旋转选定的图像效果很好。我只是指定 Storyboard.TargetName并在选择时旋转图像(省略 Trigger.ExitActions 以缩短代码)。

现在,如果我想,而不是使用 Storyboard,直接分配 45 度值,我不能这样做,因为 <Setter TargetName="globalRotation" Property="Angle" Value="45"/> : 它编译

“找不到触发器目标'globalRotation'。(目标必须出现在使用它的任何 setter 、触发器或条件之前。)”

错误。发生什么了?我想 Storyboard.TargetName在运行时评估,所以让我编译它。这样对吗?

如何在不使用 Storyboard的情况下仅使用 setter 使其工作?

最佳答案

问题是 Trigger Setter 只能针对 FrameworkElement 或 FrameworkContentElement 对象,而 Storyboard 可以与任何 DependencyProperty 一起使用。

这是一个解决方法:

<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="brd" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding RandomAngle}">
<Border.LayoutTransform>
<!--We are rotating randomly each image. Selected one will be rotated to 45°.-->
<RotateTransform Angle="{Binding ElementName=brd, Path=Tag}" x:Name="globalRotation"/>
</Border.LayoutTransform>
<Grid>
<Image Source="{Binding ImageLocation}" Stretch="None" />
<TextBlock x:Name="title" Text="{Binding Title}" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="title" Property="Visibility" Value="Visible"/>
<!--The next line will not compile.-->
<Setter TargetName="brd" Property="Tag" Value="45"/>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<!--This compiles well.-->
<DoubleAnimation Storyboard.TargetName="globalRotation" Storyboard.TargetProperty="Angle" To="45" Duration="00:00:03"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

关于Wpf:Storyboard.TargetName 有效,但 Setter TargetName 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2894836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com