2010-05-24 3 views
6

Допустим, у нас есть код XAML, как это:Wpf: Storyboard.TargetName работает, но сеттер Имя_целевого_объекта не

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

Этот код предназначен для отображения набора изображений в ListBox. Каждое изображение имеет случайное вращение, но при его выборе поворачивается на 45 градусов.

Вращение выбранного изображения через раскадровку хорошо работает. Я просто указываю Storyboard.TargetName и он поворачивает изображение, если оно выбрано (Trigger.ExitActions опущено, чтобы сделать код короче).

Теперь, если я хочу, вместо того, чтобы использовать раскадровку, назначить 45 градусов значение непосредственно, я не могу этого сделать, потому что <Setter TargetName="globalRotation" Property="Angle" Value="45"/>: он компилирует с

«Не удается найти цель Trigger 'globalRotation. (Цель должна появиться перед любыми сеттерами, триггерами или условиями, которые ее используют.) «

ошибка. Что происходит? Я полагаю, что Storyboard.TargetName оценивается во время выполнения, поэтому позвольте мне скомпилировать его. Это правильно?

Как заставить его работать только с сеттерами без использования раскадровки?

ответ

10

Дело в том, что 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> 
Смежные вопросы