2011-01-19 2 views
-1

У меня есть элемент управления Button, для которого я определяю настраиваемый шаблон. Используя некоторые Storyboard, я могу успешно управлять свойствами управления, называемыми преобразованиями и эффектами с помощью DoubleAnimation; проблема возникла, при использовании PointAnimation, что InvalidOperationException брошено, как, в VS: Cannot resolve TargetName OverlayEllipse.Настройка TargetName для PointAnimation для имени ресурса throws InvalidOperationException (XAML/Silverlight)

анимация начинается в коде, просто:

private void Button_MouseEnter(object sender, MouseEventArgs e) 
{ 
    PopUpStoryboard.Begin(); 
} 

И отношение XAML:

<Button ...>  
    <Button.Resources> 
     <RadialGradientBrush 
      x:Name="OverlayBrush" ...> 
      <RadialGradientBrush.GradientStops> 
       ... 
      </RadialGradientBrush.GradientStops> 
     </RadialGradientBrush> 
     <Storyboard x:Name="PopUpStoryboard"> 
      ... 
      <PointAnimation 
       Storyboard.TargetName="OverlayEllipse" 
       Storyboard.TargetProperty="(Shape.Fill)(RadialGradientBrush.GradientOrigin)" 
       Duration="0:0:.1" 
       To="0.9,1.2"/> 
     </Storyboard> 
    <Button.Resources> 
    <Button.Style> 
     <Style TargetType="Button"> 
      ... 
      <Setter Property="Template"> 
       <Setter.Value>  
        <ControlTemplate> 
         <Grid> 
          ...       
          <Ellipse x:Name="OverlayEllipse" Fill="{StaticResource OverlayBrush}"/> 
          ... 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Style> 
</Button> 

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

Я думал об использовании привязки StaticResource, однако это не сработает, поскольку оно относится непосредственно к объекту, а не к его названию. Я просто попытался установить Target, в отличие от TargetName, используя StaticResource связывания - это дает мне ошибку сборки (как ни странно?) О том: The property 'Target' does not exist on the type 'PointAnimation' in the namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation '.

Спасибо.

ответ

1

Вместо того, чтобы таргетировать ресурс, по-прежнему нацеливайте свойство на элемент управления (эллипс). Добавьте (Shape.Fill) для таргетинга GradientOrigin.

<PointAnimation 
    Storyboard.TargetName="OverlayEllipse" 
    Storyboard.TargetProperty="(Shape.Fill).(RadialGradientBrush.GradientOrigin)" 
    Duration="0:0:.1" 
    To="0.9,1.2"/> 

Редактировать: Вот полный образец кнопки стиля.

<Style x:Key="ButtonStyle1" TargetType="Button"> 
    <Setter Property="Background" Value="#FF1F3B53"/> 
    <Setter Property="Foreground" Value="#FF000000"/> 
    <Setter Property="Padding" Value="3"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="BorderBrush"> 
    <Setter.Value> 
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="#FFA3AEB9" Offset="0"/> 
     <GradientStop Color="#FF8399A9" Offset="0.375"/> 
     <GradientStop Color="#FF718597" Offset="0.375"/> 
     <GradientStop Color="#FF617584" Offset="1"/> 
     </LinearGradientBrush> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <Grid> 
      <Grid.Resources> 
      <RadialGradientBrush x:Key="Brush1" GradientOrigin="0.5,0.5"> 
        <GradientStop Color="White" Offset="0"/> 
        <GradientStop Color="#F9FFFFFF" Offset="0.375"/> 
        <GradientStop Color="#E5FFFFFF" Offset="0.625"/> 
        <GradientStop Color="#C6FFFFFF" Offset="1"/> 
        </RadialGradientBrush> 
      </Grid.Resources> 
      <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
       <VisualState x:Name="Normal"/> 
       <VisualState x:Name="MouseOver"> 
       <Storyboard> 
        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundAnimation"/> 
        <PointAnimation Duration="0" To="0,0.5" Storyboard.TargetProperty="(Shape.Fill).(RadialGradientBrush.GradientOrigin)" Storyboard.TargetName="BackgroundGradient" d:IsOptimized="True"/> 
       </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Pressed"> 
       <Storyboard> 
        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundAnimation"/> 
       </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Disabled"> 
       <Storyboard> 
        <DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/> 
       </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
      <VisualStateGroup x:Name="FocusStates"> 
       <VisualState x:Name="Focused"> 
       <Storyboard> 
        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
       </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Unfocused"/> 
      </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3"> 
      <Grid Background="{TemplateBinding Background}" Margin="1"> 
       <Border x:Name="BackgroundAnimation" Background="#FF448DCA" Opacity="0"/> 
       <Rectangle x:Name="BackgroundGradient" Fill="{StaticResource Brush1}"> 
       </Rectangle> 
      </Grid> 
      </Border> 
      <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
      <Rectangle x:Name="DisabledVisualElement" Fill="#FFFFFFFF" IsHitTestVisible="false" Opacity="0" RadiusY="3" RadiusX="3"/> 
      <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Margin="1" Opacity="0" RadiusY="2" RadiusX="2" Stroke="#FF6DBDD1" StrokeThickness="1"/> 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
+0

Собираясь сделать этот снимок, когда я вернусь домой, нужно еще кое-что сделать для работы - покажу вам, как получится, и спасибо. –

+0

Bah! Я исправил несколько вопросов с моим Q, главным образом до копирования и вставки из среды IDE, когда я был в середине возиться. В принципе, я пробовал это, без кубиков; Если вы не возражаете переоценивать ... (?) –

+0

Как бы то ни было, я только что играл с ним, и исключение больше не бросается, но анимация не выполняется - на самом деле это предотвращает любой из элементов раскадровки от выполнения. О, о. –

Смежные вопросы