C# 通过代码c设置多个元素的缩放动画#

C# 通过代码c设置多个元素的缩放动画#,c#,wpf,animation,storyboard,C#,Wpf,Animation,Storyboard,我有一堆网格元素,如下所示: <Grid x:Name="LevelSegment6" Opacity="1" Canvas.Left="224" Canvas.Top="109" Width="19" Height="33" Background="{DynamicResource SpiritLevelSegment}" RenderTransformOrigin="0.5,0.5"> <Grid.RenderTransform> <

我有一堆网格元素,如下所示:

<Grid x:Name="LevelSegment6" Opacity="1" Canvas.Left="224" Canvas.Top="109" Width="19" Height="33" Background="{DynamicResource SpiritLevelSegment}" RenderTransformOrigin="0.5,0.5">
     <Grid.RenderTransform>
          <TransformGroup>
               <ScaleTransform CenterX="-1" CenterY="0" ScaleX="0" ScaleY="0"/>
               <RotateTransform Angle="90"/>
          </TransformGroup>
     </Grid.RenderTransform>
</Grid>
<Storyboard x:Key="storyboard">
            <DoubleAnimation Storyboard.TargetName="LevelSegment6" Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX" To="0.3" BeginTime="0:0:0" Duration="0:0:0.5"/>
            <DoubleAnimation Storyboard.TargetName="LevelSegment6" Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY" To="0.6" BeginTime="0:0:0" Duration="0:0:0.5"/>
</Storyboard>
所有这些显然都在for循环中,所以我可以遍历所有网格。当我试着运行它时,它会在“故事板。开始(这个,真的);”中抛出一个错误

“System.InvalidOperationException”,说明中说该对象不支持此属性“RenderTransform.Children[0].ScaleX”。但它应该支持这一点,因为它基本上100%与我以前在手动编写的故事板中使用的方法相同。有人知道这里发生了什么吗?

我通过将“x:Name”放在ScaleTransform中而不是网格中来修复它:

<Grid Opacity="1" Canvas.Left="224" Canvas.Top="109" Width="19" Height="33" Background="{DynamicResource SpiritLevelSegment}" RenderTransformOrigin="0.5,0.5">
      <Grid.RenderTransform>
           <TransformGroup>
               <ScaleTransform x:Name="LevelSegment6" CenterX="-1" CenterY="0" ScaleX="0" ScaleY="0"/>
               <RotateTransform Angle="90"/>
           </TransformGroup>
      </Grid.RenderTransform>
</Grid>
我通过将“x:Name”放在ScaleTransform而不是网格中来修复它:

<Grid Opacity="1" Canvas.Left="224" Canvas.Top="109" Width="19" Height="33" Background="{DynamicResource SpiritLevelSegment}" RenderTransformOrigin="0.5,0.5">
      <Grid.RenderTransform>
           <TransformGroup>
               <ScaleTransform x:Name="LevelSegment6" CenterX="-1" CenterY="0" ScaleX="0" ScaleY="0"/>
               <RotateTransform Angle="90"/>
           </TransformGroup>
      </Grid.RenderTransform>
</Grid>

请注意,将
x:Name
分配给ScaleTransform(例如
x:Name=“scale1”
),然后调用
scale1.BeginAnimation(ScaleTransform.ScaleXProperty,animx)
。你甚至可以重复使用一个双动画。你是对的,这将是最简单的修复方法。我总是希望通过引用顶级元素使其尽可能灵活,但在这种情况下,我只需要设置缩放动画,其他什么都不需要,所以这确实有效。感谢您指出这一点。请注意,将
x:Name
分配给ScaleTransform(例如
x:Name=“scale1”
),然后调用
scale1.BeginAnimation(ScaleTransform.ScaleXProperty,animx)
。你甚至可以重复使用一个双动画。你是对的,这将是最简单的修复方法。我总是希望通过引用顶级元素使其尽可能灵活,但在这种情况下,我只需要设置缩放动画,其他什么都不需要,所以这确实有效。谢谢你指出这一点。
DoubleAnimation animx = new DoubleAnimation();
animx.Duration = TimeSpan.FromSeconds(0.5);
animx.BeginTime = TimeSpan.FromMilliseconds(0);
animx.To = 0.3;
DoubleAnimation animy = new DoubleAnimation();
animy.Duration = TimeSpan.FromSeconds(0.5);
animy.BeginTime = TimeSpan.FromMilliseconds(0);
animy.To = 0.6;

ScaleTransform scale = (ScaleTransform)FindName("LevelSegment" + i.ToString());
scale.BeginAnimation(ScaleTransform.ScaleXProperty, animx);
scale.BeginAnimation(ScaleTransform.ScaleYProperty, animy);