XAML与Code-Behind:故事板和动画

时间:2014-09-10 04:01:13

标签: wpf vb.net xaml animation storyboard

我一直在搜索互联网和MSDN网站,试图围绕整个动画交易,我有点亏。我已经看过一些例子,其中程序员会将所有动画业务编写到代码隐藏文件中,并使XAML代码相对简单。另一方面,我已经看到了相反的情况,很少有人会介意你,但我已经看过了。我试图弄清楚何时应该使用代码隐藏代码而不是使用XAML。要添加到该问题,请考虑这一点。

学习Storyboard及其类似内部阴谋的最大障碍是GetValue() - esque方法和深层绑定原则。除非你拥有完美的加密技能或出色的识别天赋(我正在看着你,MSDN!),否则很多网站都无法帮助我们全面了解这些概念。因此,对于那些仍在磨练这些技能的人(即我),我需要一些参考资料,这些参考资料能够让我有一个细致入微的理解,这样我就可以自己动手了。过去的东西

"{Binding Path=Text}"

或类似的东西(虽然,这也没有完全解释。它们对微妙的东西有点掩饰)。我需要像

这样的东西

"{Binding Path=(UIElement.Something.SomethingElse).(Property)}"

详细说明。例如:为什么他们使用括号?我只应该在绑定括号中使用一级点引用吗?我可以在括号内做限制吗?等

请将它应用于此示例:在XAML中,我目前有两个动画,两个动画在下面设置一个路径(...用于删除代码):

<Page x:Class="PhotoPage"
      ...
      ...
      >
    <Page.Resources>
        <ResourceDictionary>
            <Storyboard x:Key="RAnim_P1_2">
                <DoubleAnimation x:Name="X"
                                 Storyboard.TargetName="ReactorP1_2SclX"
                                 Storyboard.TargetProperty="ScaleX"
                                 Duration="0:0:2" From="1.0" To="15.0"
                                 />
                <DoubleAnimation x:Name="Y"
                                 Storyboard.TargetName="ReactorP1_2SclX"
                                 Storyboard.TargetProperty="ScaleY"
                                 Duration="0:0:2" From="1.0" To="15.0"
                                 />
            </Storyboard>
            <Storyboard x:Key="RAnim_P1_22">
                <DoubleAnimation x:Name="BX"
                                 Storyboard.TargetName="ReactorP1_2SclX"
                                 Storyboard.TargetProperty="ScaleX"
                                 Duration="0:0:2" From="15.0" To="1.0"
                                 />
                <DoubleAnimation x:Name="BY"
                                 Storyboard.TargetName="ReactorP1_2SclX"
                                 Storyboard.TargetProperty="ScaleY"
                                 Duration="0:0:2" From="15.0" To="1.0"
                                 />
            </Storyboard>
        </ResourceDictionary>
    </Page.Resources>
   ...
   ...
        <Viewbox Grid.Row="1">
            <Grid>
                <Path x:Name="ReactorP1_2"
                  Data="F0 M 0,0 C 0,1.44 0,3.52 0,4.8 -0.96,4.8 -1.92,4.8 -2.4,4.8
                  ...
                  ..."
                  Fill="#ffff0000" Stretch="Fill"
                  Canvas.Left="164.609" Canvas.Top="44.15" HorizontalAlignment="Center"
                  VerticalAlignment="Center">
                    <Path.RenderTransform>
                        <ScaleTransform x:Name="ReactorP1_2SclX" ScaleX="1.0" ScaleY="1.0"/>
                    </Path.RenderTransform>
                </Path>
            </Grid>
        </Viewbox>
    </Grid>
</Page>

在我的相关代码隐藏文件中,我有这个:

Imports System.Windows.Media.Animation

Class PhotoPage

    Dim NR_Running As Boolean = False

    Private Sub ToggleScale_Click(sender As Object, e As RoutedEventArgs) Handles AnimateNR.Click
        NR_Running = Not NR_Running
        Dim strybrd1 As New Storyboard()
        strybrd1 = Me.Resources("RAnim_P1_2")
        Dim strybrd2 As New Storyboard()
        strybrd2 = Me.Resources("RAnim_P1_22")

        Dim anim1 = strybrd1.Children("X")

        If strybrd1 IsNot Nothing Then
            If strybrd2 IsNot Nothing Then
                If NR_Running Then
                    strybrd1.Begin()
                Else
                    strybrd2.Begin()
                End If
            End If
        End If
    End Sub
End Class

此代码应该在单击页面中的按钮时使路径大小增加。这样可行。当您再次单击该按钮时,它还会使路径缩小。但是,我想要一些额外的东西。当我在按钮生长的过程中单击按钮时,我希望动画能够在正确的位置转动并开始缩小,反之亦然。目前,当我在动画期间单击时,它将跳到当前正在运行的动画的结尾,然后开始缩小,使形状&#34;弹出&#34;,可以这么说,而不是从平滑过渡到越来越萎缩。我希望它顺利。

我看到这个工作的方式是访问故事板中的动画,将新动画的To设置为正在运行的动画的From,然后设置TargetProperty正在运行的动画的值到新的From。然后,将新Duration设置为&#34;基本持续时间&#34;之间的差值。和#34;当前时间&#34;正在运行的。然后让新的运行。但是,我不知道如何从代码隐藏中访问动画,这需要发生,因为这一切都是通过点击按钮来运行的。

一旦得到帮助,我应该能够知道如何使用StoryBoard类的GetValue()方法来获取其Animation子元素的属性,以及能够将一些TextBlock绑定到那些动画属性,我就可以看到它们是否实时更新。

对不起,这是如此啰嗦,但我已经为此工作了两天,而且我无法如何使这个查询简洁明了。我不确定我是否能很好地解释它。有人可以帮我这个吗?

0 个答案:

没有答案