Windows Phone 7中的同步故事板

时间:2012-08-01 06:16:15

标签: c# windows-phone-7 storyboard

我看到了我能想到的任何地方,但我找不到答案......

我想为Windows Phone 7(xaml和c#)制作一种模板Storyboard,然后使用该故事板以相同的方式为多个对象制作动画。 (即同时将所有物体旋转90度)任何想法?

必须动态完成。我的意思是我想在程序中为不同的故事板分配不同的对象,所以它不能是静态的。

到目前为止,我遇到的主要问题是故事板必须先停止才能再次使用,因此无法同时运行。我当时在想,如果我可以制作故事板的临时副本,我可以同时运行它们吗?请告诉我你的任何想法。提前谢谢!

我在网格中初始化我的对象(矩形):

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <Rectangle Name="rec1" Height="80" Width="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,30,140,0">
      <Rectangle.RenderTransform>
         <RotateTransform x:Name="rec1Transform" Angle="0" CenterX="5" CenterY="-10" />
      </Rectangle.RenderTransform>
   </Rectangle>
   <Rectangle Name="rec2" Height="10" Width="80" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,15,55,0">
   .
   .
   .
   </Rectangle>
</Grid>

此刻,我有4个一般故事板,我想多次使用,我使用一系列按钮来模仿所有动画。例如:

我的故事板

private void rotate1(object parameter, object secondParameter, String Target)
{

   oneTwo.Stop();
   oneTwo.Children[0].SetValue(Storyboard.TargetNameProperty, Target);
   oneTwo.Begin();
}

private void rotate2(object parameter, object secondParameter, String Target)
{
   twoThree.Stop();
   twoThree.Children[0].SetValue(Storyboard.TargetNameProperty, Target);
   twoThree.Begin();
}

private void rotate1Inverse(object parameter, object secondParameter, string Target)
{
   twoOne.Stop();
   twoOne.Children[0].SetValue(Storyboard.TargetNameProperty, Target);
   twoOne.Begin();
}

private void rotate2Inverse(object parameter, object secondParameter, string Target)
{
   threeTwo.Stop();
   threeTwo.Children[0].SetValue(Storyboard.TargetNameProperty, Target.ToString());
   threeTwo.Begin();
}

我的模拟按钮

//Rotate Buttons
private void button_Click1(object sender, RoutedEventArgs e)
{
    rec1Transform.CenterY = -10;

    rotate2(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec1Transform");
}

private void button_Click2(object sender, RoutedEventArgs e)
{
    rec2Transform.CenterX = -10;

    rotate1(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec2Transform");
}

private void button_Click3(object sender, RoutedEventArgs e)
{
    rec3Transform.CenterY = -10;

    rotate1(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec3Transform");
}

private void button_Click4(object sender, RoutedEventArgs e)
{
    rec4Transform.CenterX = -10;

    rotate2(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec4Transform");
}

private void button_Click5(object sender, RoutedEventArgs e)
{
    rec5Transform.CenterY = -10;

    rotate2(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec5Transform");
}

private void button_Click6(object sender, RoutedEventArgs e)
{
    rec6Transform.CenterX = -10;

    rotate2(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec6Transform");
}

private void button_Click7(object sender, RoutedEventArgs e)
{
    rec7Transform.CenterY = -10;

    rotate1(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec7Transform");
}

//Inverse Rotate Buttons
private void button_Click1_Inverse(object sender, RoutedEventArgs e)
{
    rec1Transform.CenterY = 90;

    rotate1Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec1Transform");
}

private void button_Click2_Inverse(object sender, RoutedEventArgs e)
{
    rec2Transform.CenterX = 90;

    rotate2Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec2Transform");
}

private void button_Click3_Inverse(object sender, RoutedEventArgs e)
{
    rec3Transform.CenterY = 90;

    rotate2Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec3Transform");
}

private void button_Click4_Inverse(object sender, RoutedEventArgs e)
{
    rec4Transform.CenterX = 90;

    rotate1Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec4Transform");
}

private void button_Click5_Inverse(object sender, RoutedEventArgs e)
{
    rec5Transform.CenterY = 90;

    rotate1Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec5Transform");
}

private void button_Click6_Inverse(object sender, RoutedEventArgs e)
{
    rec6Transform.CenterX = 90;

    rotate1Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec6Transform");
}

private void button_Click7_Inverse(object sender, RoutedEventArgs e)
{
    rec7Transform.CenterY = 90;

    rotate2Inverse(RotateTransform.AngleProperty, PlaneProjection.RotationZProperty, "rec7Transform");
}

问题是我想同时在多达20个矩形上使用这4个基本故事板,从而统一动画所有20个矩形。但我不希望为每个矩形分配一个静态故事板,因为我想要应用于每个矩形的故事板每隔一秒左右就会发生变化。我也将同时使用所有4个故事板。 (即我将对3个矩形使用“oneTwo”,对5个矩形使用“twoThree”,对于8个矩形使用“twoOne”,对于2个矩形使用“threeTwo”)

我希望一切都有道理。该程序完全基于同时动画许多矩形,任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试绑定stackpanel中的矩形

 <Listbox> 
 <ListBox.ItemTemplate>        
  <DataTemplate> 
 <StackPanel>
 <StackPanel.Resources>
    <Storyboard x:Name="FirstStoryBoard">
        <DoubleAnimation Storyboard.TargetName="rectangle"
                         Storyboard.TargetProperty="Width"
                         From="0"
                         To="1"
                         //AutoReverse="True"
                         Duration="00:00:01" />
    </Storyboard>
 </StackPanel.Resources>
 <Rectangle Name="rectangle" Fill={Binding colour}>

 </Rectangle>

 </StackPanel>

 </ListBox.ItemTemplate>
 </DataTemplate> 
 </Listbox>

然后在列表框中使用colours..refer绑定在web中的列表框项目中进行绑定。

然后点击按钮启动故事板。故事板儿童矩形增加其宽度

FirstStoryboard.begin();

相关问题