Diciamo che abbiamo un codice XAML come questo:WPF: Storyboard.TargetName funziona, ma Setter TargetName non si
<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>
Questo codice ha lo scopo di visualizzare una serie di immagini in una casella di riepilogo. Ogni immagine ha una rotazione casuale, ma quando è selezionata, ruota a 45 gradi.
La rotazione dell'immagine selezionata tramite uno storyboard funziona correttamente. Ho appena specificato Storyboard.TargetName
e ruota l'immagine quando selezionato (Trigger.ExitActions
è omesso per abbreviare il codice).
Ora, se voglio, invece di utilizzare uno storyboard, assegnare il valore di 45 gradi direttamente, io non posso farlo, perché <Setter TargetName="globalRotation" Property="Angle" Value="45"/>
: si compila con
"Impossibile trovare il bersaglio Trigger 'globalRotation'. (L'obiettivo deve apparire prima di qualsiasi Setter, Trigger o Condizioni che lo utilizzano. "
errore. Che succede? Suppongo che Storyboard.TargetName
sia valutato durante il runtime, quindi permettimi di compilarlo. È giusto?
Come farlo funzionare solo con un setter, senza utilizzare uno storyboard?