【问题标题】:Setting TargetName of PointAnimation to name of resource throws InvalidOperationException (XAML/Silverlight)将 PointAnimation 的 TargetName 设置为资源名称会引发 InvalidOperationException (XAML/Silverlight)
【发布时间】:2011-06-12 03:26:50
【问题描述】:

我有一个Button 控件,我正在为其定义一个自定义模板。使用一些Storyboard's,我可以使用DoubleAnimation's 成功地操作控件属性、命名变换和效果;问题出现了,当使用PointAnimation 时,InvalidOperationException 被抛出,根据 VS:Cannot resolve TargetName OverlayEllipse.

动画是在代码中启动的,很简单:

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 绑定,但是,考虑到它直接引用对象而不是它的名称,这是行不通的。我只是尝试使用StaticResource 绑定设置Target,而不是TargetName - 这给了我一个构建错误(够奇怪吗?)说明:The property 'Target' does not exist on the type 'PointAnimation' in the namespace @987654321@'.

谢谢。

【问题讨论】:

    标签: xaml silverlight-4.0 binding resources storyboard


    【解决方案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>
    

    【讨论】:

    • 我回家后要试一试,还要工作几个小时 - 会让你知道结果如何,谢谢。
    • 呸!我已经纠正了我的 Q 的一些问题,主要是当我在修修补补时从 IDE 复制和粘贴。基本上,我试过这个,没有骰子;如果您不介意重新评估...(?)
    • 碰巧的是,我一直在玩它并且不再抛出异常,但动画没有执行 - 事实上,这会阻止任何情节提要元素执行。哦哦。
    • 添加了完整的按钮样式。注意我把资源放在了按钮模板的Grid资源中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多