如何在C#中为我的页面资源添加故事板动画,然后再调用它?

时间:2014-11-08 17:55:13

标签: c# windows xaml animation storyboard

HubPage是我的目标网页。在Hubpage.xaml上,我有一个3x3的网格,包含一个Rectangle,我称之为“单元格”。在HubPage.xaml.cs中,特别是在HubPage()构造函数中,我为每个单元格创建了一个故事板:

CreateStoryboardForCell("Column0Row0");
CreateStoryboardForCell("Column0Row1");
...
CreateStoryboardForCell("Column2Row2");

我想在Page.Resources中添加一个故事板,通常我会在XAML中进行,但我是从C#尝试的。现在,这是CreateStoryboardForCell实现:

    private void CreateStoryboardForCell(string cellName)
    {
        // Create two DoubleAnimations, one for scaleX and one for scaleY, and set their properties.
        Duration duration = new Duration(TimeSpan.FromSeconds(0.2));
        DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();
        DoubleAnimation myDoubleAnimation2 = new DoubleAnimation();
        myDoubleAnimation1.Duration = duration;
        myDoubleAnimation2.Duration = duration;

        Storyboard sb = new Storyboard();
        sb.Duration = duration;

        sb.Children.Add(myDoubleAnimation1);
        sb.Children.Add(myDoubleAnimation2);

        // Set the targets of the animations
        Storyboard.SetTarget(myDoubleAnimation1, Column0Row0);
        Storyboard.SetTarget(myDoubleAnimation2, Column0Row0);

        // Set the attached properties of ScaleX and ScaleY
        // to be the target properties of the two respective DoubleAnimations
        Storyboard.SetTargetProperty(myDoubleAnimation1, "(UIElement.RenderTransform).(CompositeTransform.ScaleX)");
        Storyboard.SetTargetProperty(myDoubleAnimation2, "(UIElement.RenderTransform).(CompositeTransform.ScaleY)");
        myDoubleAnimation1.To = 15;
        myDoubleAnimation2.To = 22;

        // Make the Storyboard a resource.
        try
        {
            pageRoot.Resources.Add("story" + cellName, sb);
        }
        catch (Exception e)
        {
            Status.Text = "Error adding storyboard resource for cell" + cellName + ": " + e.Message;
        }
    }

pageRoot来自Hubpage.xaml:Page x:Name =“pageRoot”等。添加资源时我没有异常,但是当我设置断点时我看不到资源,所以我假设它已被添加成功,因为我可以看到计数增加,并没有抛出异常。

接下来,我为每个列单元格提供了一个单击处理程序,我在其中推断行和列编号,并尝试启动之前添加到页面资源的相应故事板。这是代码:

    private void Column1_Cell_Click(object sender, RoutedEventArgs e)
    {

        Rectangle rect = sender as Rectangle;
        int x = (int)rect.GetValue(Grid.RowProperty);
        int y = (int)rect.GetValue(Grid.ColumnProperty);
        string storyboardName = "storyColumn" + y + "Row" + x;
        Storyboard storyboard = (Storyboard)FindName(storyboardName);

        storyboard.Begin();
    }

但FindName调用始终返回空故事板。我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

请尝试使用此代码。我总是使用此代码查找故事板。它有效。

这是代码:

FrameworkElement element = new FrameworkElement();
Storyboard sb=new Storyboard ();
sb = element.FindResource("Please write here Storyboard Key") as Storyboard;
sb.Begin(target element name , true);

答案 1 :(得分:1)

我已经为您编写了此代码。我希望为业务带来好处

这是代码:

   <Grid>       
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column0Row0"/>
        <ColumnDefinition x:Name="Column0Row1"/>
        <ColumnDefinition x:Name="Column0Row2"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Rectangle Fill="Pink" x:Name="rectangle" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/>
    <Rectangle Grid.Column="1" Grid.Row="1" Fill="Coral" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/>
    <Rectangle Grid.Column="2"  Grid.Row="2" Fill="Orange" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/>
</Grid>

代码背后:

private void CreateStoryboardForCell(Rectangle target)
    {
        ScaleTransform trans = new ScaleTransform();
        target.RenderTransform = trans;
        DoubleAnimation anim = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000));
        trans.BeginAnimation(ScaleTransform.ScaleXProperty, anim);
        trans.BeginAnimation(ScaleTransform.ScaleYProperty, anim);

    }

    private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        CreateStoryboardForCell((Rectangle)sender);            
    }     

答案 2 :(得分:0)

如果在WinRT中不支持BeginStoryboard。您可以使用以下代码。我在codedehind中创建了动画。也许你可以解决这个问题;我对这个问题进行了一些研究。 我试过这个代码。它有效。

这是代码:

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Storyboard storyboard = new Storyboard();

        ScaleTransform scale = new ScaleTransform(1.0, 1.0);
        animatedRectangle.RenderTransformOrigin = new Point(0.5, 0.5);
        animatedRectangle.RenderTransform = scale;

        DoubleAnimation scaleAnimation1 = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000));
        DoubleAnimation scaleAnimation2 = new DoubleAnimation(1, 2, TimeSpan.FromMilliseconds(1000));
        storyboard.Children.Add(scaleAnimation1);
        storyboard.Children.Add(scaleAnimation2);

        Storyboard.SetTargetProperty(scaleAnimation1, new PropertyPath("RenderTransform.ScaleX"));
        Storyboard.SetTargetProperty(scaleAnimation2, new PropertyPath("RenderTransform.ScaleY"));


        Storyboard.SetTarget(scaleAnimation1, animatedRectangle);
        Storyboard.SetTarget(scaleAnimation2, animatedRectangle);

        storyboard.Begin();         

    }