WPF - 无法使故事板影响另一个本地资源

时间:2009-12-02 14:24:27

标签: wpf animation storyboard

我已将Transformation和Storyboard设置为本地资源,但是当我从按钮触发故事板时,我收到以下错误:

{“'WorldTranslation'名称在'System.Windows.Controls.Button'的名称范围内找不到。”}

有人能指出我正确的方向吗?

<Window.Resources>

    <Transform3DGroup x:Key="WorldTranslation">
        <RotateTransform3D>
            <RotateTransform3D.Rotation>
                <AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,1,0" Angle="0" />
            </RotateTransform3D.Rotation>
        </RotateTransform3D>
    </Transform3DGroup>

    <Storyboard x:Key="MyStoryboard">
        <DoubleAnimation
            Storyboard.TargetName="WorldTranslation"
        Storyboard.TargetProperty="(Transform3DGroup).(RotateTransform3D).(RotateTransform3D.Rotation).(AxisAngleRotation3D.Angle)"
        From="0"
        To="360"
        Duration="0:0:1"   
       />
    </Storyboard>

</Window.Resources>

然后是按钮xaml ......

<Button Height="20" Width="100">
   <Button.Content>Blah</Button.Content>
       <Button.Triggers>
          <EventTrigger RoutedEvent="Button.Click">
               <EventTrigger.Actions>
                   <BeginStoryboard Storyboard="{StaticResource MyStoryboard}" >

                    </BeginStoryboard>
                </EventTrigger.Actions>
          </EventTrigger>
       </Button.Triggers>
  </Button>

1 个答案:

答案 0 :(得分:7)

你的XAML有几个问题。我将从内联转换开始,然后将其重构为资源。我改为2D RotateTransform,以免造成不必要的事情。

我们从:

开始
       <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <RotateTransform Angle="0" x:Name="MyAnimatedTransform"/>
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                              Storyboard.TargetName="MyAnimatedTransform"
                              Storyboard.TargetProperty="(RotateTransform.Angle)"
                              From="0.0" To="360" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>

然后我们拿出StoryBoard:

<Window.Resources>
    <Storyboard x:Key="MyStoryBoard">
        <DoubleAnimation
           Storyboard.TargetName="MyAnimatedTransform"
           Storyboard.TargetProperty="(RotateTransform.Angle)"
           From="0.0" To="360" Duration="0:0:.3" />
    </Storyboard>
</Window.Resources>
<Grid>
    <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <RotateTransform Angle="0" x:Name="MyAnimatedTransform"/>
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>

最后是RotateTransform。通过Storyboard.TargetName属性引用它在此处不起作用。您需要Storyboard.Target属性:

<Window.Resources>
    <RotateTransform Angle="0" x:Key="WorldTransform"/>
    <Storyboard x:Key="MyStoryBoard">
        <DoubleAnimation
           Storyboard.Target="{Binding TemplatedParent}"
           Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
           From="0.0" To="360" Duration="0:0:.3" />
    </Storyboard>
</Window.Resources>
<Grid>
    <Button Height="20" Width="100"
            RenderTransformOrigin=".5,.5"
            Content="Blah">
        <Button.RenderTransform>
            <StaticResource ResourceKey="WorldTransform" />
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
                </EventTrigger.Actions>
            </EventTrigger>
        </Button.Triggers>
    </Button>
</Grid>

编辑:由于奖金问题;-) 假设您希望转换发生在包含的网格上。只需捕获Grid中的Button.Click事件(事件被路由记住?)并将触发器放在那里。 TemplatedParent现在将成为网格,而不再是按钮。

 <Grid RenderTransformOrigin=".5,.5">
    <Grid.RenderTransform>
        <StaticResource ResourceKey="WorldTransform"/>
    </Grid.RenderTransform>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
            <EventTrigger.Actions>
                <BeginStoryboard Storyboard="{StaticResource MyStoryBoard}"/>
            </EventTrigger.Actions>
        </EventTrigger>
    </Grid.Triggers>
    <Button Height="20" Width="100"
            Content="Blah">
    </Button>
</Grid>