Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将情节提要动画添加到C#中的页面资源中,然后稍后再调用?_C#_Windows_Xaml_Animation_Storyboard - Fatal编程技术网

如何将情节提要动画添加到C#中的页面资源中,然后稍后再调用?

如何将情节提要动画添加到C#中的页面资源中,然后稍后再调用?,c#,windows,xaml,animation,storyboard,C#,Windows,Xaml,Animation,Storyboard,Hubbage是我的登录页。在Hubpage.xaml上,我有一个3x3的网格,包含一个矩形,我称之为“单元格”。在HubPage.xaml.cs中,特别是在HubPage()构造函数中,我为每个单元格创建了一个故事板: CreateStoryboardForCell("Column0Row0"); CreateStoryboardForCell("Column0Row1"); ... CreateStoryboardForCell("Column2Row2"); 我想在页面中添加一个故事板。

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

CreateStoryboardForCell("Column0Row0");
CreateStoryboardForCell("Column0Row1");
...
CreateStoryboardForCell("Column2Row2");
我想在页面中添加一个故事板。参考资料,通常我会在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调用总是返回一个空的故事板。我缺少什么?

请尝试此代码。我总是使用此代码查找情节提要。它很有效

以下是代码:

FrameworkElement element = new FrameworkElement();
Storyboard sb=new Storyboard ();
sb = element.FindResource("Please write here Storyboard Key") as Storyboard;
sb.Begin(target element name , true);
   <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 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();         

    }        

我已经为您编写了这段代码。我希望对业务有所裨益

以下是代码:

FrameworkElement element = new FrameworkElement();
Storyboard sb=new Storyboard ();
sb = element.FindResource("Please write here Storyboard Key") as Storyboard;
sb.Begin(target element name , true);
   <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 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();         

    }        

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

以下是代码:

FrameworkElement element = new FrameworkElement();
Storyboard sb=new Storyboard ();
sb = element.FindResource("Please write here Storyboard Key") as Storyboard;
sb.Begin(target element name , true);
   <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 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();         

    }        

“目标元素名称”是要应用动画对象的名称。例如椭圆对象。x:Name=“椭圆”。ellipse是目标元素名称。(对不起,我英语不太好,希望你能理解)谢谢你的帮助。我尝试了您的方法,但WinRT上似乎找不到FindResource。如果您的样式是在App.xaml的参考资料中定义的,则可以使用以下代码var animation=Application.Current.Resources[“ShowVideoCallPanel”]作为情节提要;参考资料[“故事板键”]我正在C#中运行时添加故事板,请参阅pageRoot.Resources.Add(“故事”+cellName,sb);请回答问题。如果您还有其他问题。我会尽力帮助您。我得到的错误是“Windows.UI.Xaml.Media.ScaleTransform”不包含“BeginAnimation”的定义,并且找不到接受“Windows.UI.Xaml.Media.ScaleTransform”类型的第一个参数的扩展方法“BeginAnimation”(您是否缺少using指令或程序集引用?)。我想这是WPF,我需要Windows应用商店app.BeginAnimation对我不起作用,但您为我设置了正确的路径,因此我将此标记为答案。我做错了什么:将每个目标的不同情节提要保存到app.Current.Resources,然后在每个目标上检索(矩形)点击。相反,我拦截点击,动态创建故事板,它就像一个符咒:)请查看此网站在此网站中有一个名为CompositeTransform.CompositeTransform的代码用于winrt应用程序。我在Wpf应用程序中尝试了此代码,但不起作用。因为Wpf不支持复合转换。请尝试上面的代码。如果不起作用,可以在此处查看“”轻松:)