CHANDRA
CHANDRA

Reputation: 4928

issue in Deleting Storyboard in wpf

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="QWERTY.animation"
x:Name="Window"
Title="animation"
Width="640" Height="480">
<Window.Resources>
    <Storyboard x:Key="Animation">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.FontSize)" Storyboard.TargetName="btn_1">
            <EasingDoubleKeyFrame KeyTime="0" Value="11"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="10.667"/>
        </DoubleAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.FontWeight)" Storyboard.TargetName="btn_1">
            <DiscreteObjectKeyFrame KeyTime="0">
                <DiscreteObjectKeyFrame.Value>
                    <FontWeight>Normal</FontWeight>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
            <DiscreteObjectKeyFrame KeyTime="0:0:0.3">
                <DiscreteObjectKeyFrame.Value>
                    <FontWeight>Bold</FontWeight>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="btn_1">
            <EasingColorKeyFrame KeyTime="0" Value="#FFEAF0ED"/>
            <EasingColorKeyFrame KeyTime="0:0:0.3" Value="#FF106285"/>
        </ColorAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <Button x:Name="btn_2" Content="B" Height="55" Margin="236,98,0,0" VerticalAlignment="Top" Click="btn_2_Click" HorizontalAlignment="Left" Width="72" />
    <Button x:Name="btn_1" Content="A" Height="55" Margin="115,98,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="72" Click="btn_1_Click">
        <Button.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="White" Offset="0"/>
                <GradientStop Color="#FFEAF0ED" Offset="0.9"/>
            </LinearGradientBrush>
        </Button.Background>
    </Button>
    <Button Content="Remove" HorizontalAlignment="Left" Margin="173,179,0,217" Width="75" Click="Button_Click" />
</Grid>

The design will be like below

enter image description here

public partial class animation : Window
        {
    Storyboard SB;
    public animation()
    {
        this.InitializeComponent();         
    }

    public void Animate(string name)
    {
        SB = (Storyboard)(FindResource("Animation"));
        Storyboard.SetTargetName(SB.Children[0], name);
        Storyboard.SetTargetName(SB.Children[1], name);
        Storyboard.SetTargetName(SB.Children[2], name);
        SB.Begin();            
    }
    private void btn_1_Click(object sender, RoutedEventArgs e)
    {
        Button Btn_1 = (Button)sender;
        Animate(btn_1.Name);
    }

    private void btn_2_Click(object sender, RoutedEventArgs e)
    {
        Button Btn_2 = (Button)sender;
        Animate(Btn_2.Name);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SB.Remove();
    }
}

It's output will be like below

Output

The above result is after i clicked two buttons one by one.Then I clicked the remove button,only the button B animation is removed. But i want to remove button A and button B animation by clicking of remove button.

Upvotes: 1

Views: 1197

Answers (1)

Mark Hall
Mark Hall

Reputation: 54532

You can have only one TargetName at a Time assigned to the Storyboard. By using SetTargetName you are Transfering the Target to the new Button. Then when you click remove, you remove the last one you added. Take a look at this Blog its for SilverLight but should apply here. Your only other option would to be to use Style.Triggers and put your animation in the Style.

From above Link:

In this example, it might not be desirable to stop an animation on one rectangle so that the animation can start on another rectangle. Perhaps you want both animations to run at the same time. However, you cannot use the same animation object to run two separate animations at the same time, because there is only one TargetName. This does not mean that you are back to creating a separate Storyboard for every object. Instead, you need one Storyboard for each animation that you want to run concurrently (synchronously).

Upvotes: 1

Related Questions