C# 故事板应用于许多元素

C# 故事板应用于许多元素,c#,.net,wpf,C#,.net,Wpf,我的WPF应用程序中有两个矩形。我想在单击元素时播放动画。动画应仅应用于单击的矩形。使用下面的代码,当我单击一个矩形时,所有的形状都会被设置动画 我该怎么办 Window.Resources> <ResourceDictionary> <LinearGradientBrush x:Key="ExecutionInitialization" EndPoint="0.5,1" StartPoint="0.5,0">

我的WPF应用程序中有两个矩形。我想在单击元素时播放动画。动画应仅应用于单击的矩形。使用下面的代码,当我单击一个矩形时,所有的形状都会被设置动画

我该怎么办

Window.Resources>
    <ResourceDictionary>

            <LinearGradientBrush x:Key="ExecutionInitialization" EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFC0FBBA"/>
                <GradientStop Color="#FF0FA000" Offset="1"/>
                <GradientStop Color="#FF0FA000"/>
            </LinearGradientBrush>

        <Storyboard x:Key="OnMouseLeftButtonDown1" RepeatBehavior="Forever">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Offset)" Storyboard.TargetName="rec1">
                <SplineDoubleKeyFrame KeyTime="0" Value="0.17"/>
                <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="0.32"/>
                <SplineDoubleKeyFrame KeyTime="0:0:0.8" Value="0.5"/>
                <SplineDoubleKeyFrame KeyTime="0:0:1" Value="0.56"/>
                <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </ResourceDictionary>


</Window.Resources>

<Grid>
    <Rectangle MouseDown="rec1_MouseDown" Name="rec1" Fill="{StaticResource ExecutionInitialization}" HorizontalAlignment="Left" Height="85.075" Margin="24.358,27.731,0,0" Stroke="Red" VerticalAlignment="Top" Width="156.717"/>

    <Rectangle MouseDown="rec2_MouseDown" Name="rec2" Fill="{StaticResource ExecutionInitialization}" HorizontalAlignment="Left" Height="113.433" Margin="246.746,141.164,0,0" Stroke="Black" VerticalAlignment="Center" Width="211.941"/>

</Grid>

只需将LinearGradientBrush资源上的
x:Shared
属性设置为
false
。然后,每个矩形的“填充”属性都会获得指定的笔刷的副本

<LinearGradientBrush x:Key="ExecutionInitialization" x:Shared="false"
                     EndPoint="0.5,1" StartPoint="0.5,0">
    ...
</LinearGradientBrush>
然后,您还可以对所有此类矩形使用相同的事件处理程序:

<Rectangle x:Name="rec1" MouseDown="Rectangle_MouseDown" .../>
<Rectangle x:Name="rec2" MouseDown="Rectangle_MouseDown" .../>

private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
    var storyboard = TryFindResource("OnMouseLeftButtonDown1") as Storyboard;
    storyboard.Begin((FrameworkElement)sender);
}
<Rectangle x:Name="rec1" MouseDown="Rectangle_MouseDown" .../>
<Rectangle x:Name="rec2" MouseDown="Rectangle_MouseDown" .../>