2013-06-24 1 views
0

Я пытаюсь написать ControlTemplate для кнопки в XAML. В коллекции триггеров я хочу повернуть один элемент кнопки с помощью RotateTransform, который позже будет анимироваться (для простоты оставлена ​​анимация). Для этого мне нужно сослаться на свойство Angle преобразования поворотов, прикрепленное к элементу кнопки. И в этом проблема: я не могу найти способ ссылаться на нее. Вот код:Невозможно найти способ анимации RotateTransform в ControlTemplate

<ControlTemplate x:Key="myButtonTemplate" 
       TargetType="Button"> 
    <Grid> 
     <Ellipse x:Name="OuterCircle" 
       RenderTransformOrigin="0.5, 0.5"> 
      <Ellipse.Fill> 
       <RadialGradientBrush Center="0.7,0.7"> 
        <GradientStop Offset="0.9" Color="DarkBlue"/> 
        <GradientStop Offset="0.2" Color="White"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
      <Ellipse.RenderTransform> 
       <RotateTransform x:Name="myTransform" Angle="0"/> 
      </Ellipse.RenderTransform> 
     </Ellipse> 
     <Ellipse x:Name="InnerCircle" 
       RenderTransformOrigin="0.5, 0.5" 
       Stroke="DarkBlue" 
       > 
      <Ellipse.Fill> 
       <RadialGradientBrush Center="0.35,0.35" 
            RadiusX="0.7" 
            RadiusY="0.7"> 
        <GradientStop Offset="0.05" Color="#70B0FF"/> 
        <GradientStop Offset="0.9" Color="DarkBlue"/> 
       </RadialGradientBrush> 
      </Ellipse.Fill> 
      <Ellipse.RenderTransform> 
       <ScaleTransform ScaleX="0.8" ScaleY="0.8"/> 
      </Ellipse.RenderTransform> 
     </Ellipse> 
     <Viewbox Margin="10"> 
      <ContentPresenter Margin="{TemplateBinding Padding}"/> 
     </Viewbox> 
    </Grid> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="myTransform" Property="Angle" Value="90"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 

</ControlTemplate> 

Я попытался дать RotateTransform имя по х: Name = «myTransform» и ссылаться на него, используя его в качестве Имя_целевого_объекта в сеттер. Это не сработало. Другие вещи, которые попробовали, были «усеяны», как TargetName="OuterCircle.RenderTransofrm.RotateTransform". Никакой радости.

Кажется, что это должно быть легко и возможно. Может ли кто-нибудь указать мне в правильном направлении?

Спасибо, - Крис.

ответ

1

На самом деле вы можете получить доступ к myTransform при установке Storyboard.TargetName:

<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="MouseEnter"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Storyboard.TargetName="myTransform" 
           Storyboard.TargetProperty="Angle" 
           To="90" Duration="0:0:0.1"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="MouseLeave"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Storyboard.TargetName="myTransform" 
           Storyboard.TargetProperty="Angle" 
           To="0" Duration="0:0:0.1"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</ControlTemplate.Triggers> 
+0

Спасибо, Клеменс, ваше решение работает! Просто чтобы улучшить свой личный опыт: как это будет работать с триггером свойства, где вы не можете использовать 'Storyboard.TargetName'? Другими словами: есть ли способ заставить оригинальный пример работать? Очарование этого было бы в том, что вам нужен только один триггер на 'IsMouseOver = True' вместо двух EventTriggers. –