2010-05-24 9 views
6

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?

risposta

10

Il fatto è che Trigger Setter può scegliere come target solo oggetti FrameworkElement o FrameworkContentElement, mentre Storyboard funziona con qualsiasi DependencyProperty.

Ecco una soluzione:

<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> 
Problemi correlati