Exemplo n.º 1
0
        public RepeatBehaviorExample()
        {
            // Create a name scope for the page.
            NameScope.SetNameScope(this, new NameScope());

            this.WindowTitle = "RepeatBehavior Example";

            Border myBorder = new Border();

            myBorder.HorizontalAlignment = HorizontalAlignment.Stretch;
            this.Content = myBorder;

            StackPanel myStackPanel = new StackPanel();

            myStackPanel.Margin = new Thickness(20);
            myBorder.Child      = myStackPanel;

            Border          myBorder1         = new Border();
            SolidColorBrush mySolidColorBrush = new SolidColorBrush(Color.FromArgb(153, 255, 255, 255));

            myBorder1.Background = mySolidColorBrush;
            myStackPanel.Children.Add(myBorder1);

            TextBlock myTextBlock = new TextBlock();

            myTextBlock.Margin = new Thickness(20);
            myTextBlock.Text   = "This example shows how the RepeatBehavior property ";
            myTextBlock.Text  += "is used to make a timeline repeat. Several rectangles are animated by ";
            myTextBlock.Text  += "DoubleAnimations with identical durations and target values, but with different ";
            myTextBlock.Text  += "RepeatBehavior settings.";
            myBorder1.Child    = myTextBlock;

            myTextBlock      = new TextBlock();
            myTextBlock.Text = "\nRepeatBehavior=\"Forever\" ";
            myStackPanel.Children.Add(myTextBlock);

            Rectangle foreverRepeatingRectangle = new Rectangle();

            foreverRepeatingRectangle.Name = "foreverRepeatingRectangle";
            this.RegisterName(foreverRepeatingRectangle.Name, foreverRepeatingRectangle);
            mySolidColorBrush = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
            foreverRepeatingRectangle.Fill   = mySolidColorBrush;
            foreverRepeatingRectangle.Width  = 50;
            foreverRepeatingRectangle.Height = 20;
            foreverRepeatingRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(foreverRepeatingRectangle);


            myTextBlock      = new TextBlock();
            myTextBlock.Text = "\nRepeatBehavior=\"0:0:4\" ";
            myStackPanel.Children.Add(myTextBlock);


            Rectangle fourSecondsRepeatingRectangle = new Rectangle();

            fourSecondsRepeatingRectangle.Name = "fourSecondsRepeatingRectangle";
            this.RegisterName(fourSecondsRepeatingRectangle.Name, fourSecondsRepeatingRectangle);
            fourSecondsRepeatingRectangle.Fill   = mySolidColorBrush;
            fourSecondsRepeatingRectangle.Width  = 50;
            fourSecondsRepeatingRectangle.Height = 20;
            fourSecondsRepeatingRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(fourSecondsRepeatingRectangle);

            myTextBlock      = new TextBlock();
            myTextBlock.Text = "\nRepeatBehavior=\"2x\" ";
            myStackPanel.Children.Add(myTextBlock);

            Rectangle twiceRepeatingRectangle = new Rectangle();

            twiceRepeatingRectangle.Name = "twiceRepeatingRectangle";
            this.RegisterName(twiceRepeatingRectangle.Name, twiceRepeatingRectangle);
            twiceRepeatingRectangle.Fill   = mySolidColorBrush;
            twiceRepeatingRectangle.Width  = 50;
            twiceRepeatingRectangle.Height = 20;
            twiceRepeatingRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(twiceRepeatingRectangle);

            myTextBlock      = new TextBlock();
            myTextBlock.Text = "\nRepeatBehavior=\"0.05\" ";
            myStackPanel.Children.Add(myTextBlock);

            Rectangle halfRepeatingRectangle = new Rectangle();

            halfRepeatingRectangle.Name = "halfRepeatingRectangle";
            this.RegisterName(halfRepeatingRectangle.Name, halfRepeatingRectangle);

            halfRepeatingRectangle.Fill   = mySolidColorBrush;
            halfRepeatingRectangle.Width  = 50;
            halfRepeatingRectangle.Height = 20;
            halfRepeatingRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(halfRepeatingRectangle);

            myTextBlock      = new TextBlock();
            myTextBlock.Text = "\nRepeatBehavior=\"0:0:1\" ";
            myStackPanel.Children.Add(myTextBlock);

            Rectangle oneSecondRepeatingRectangle = new Rectangle();

            oneSecondRepeatingRectangle.Name = "oneSecondRepeatingRectangle";
            this.RegisterName(oneSecondRepeatingRectangle.Name, oneSecondRepeatingRectangle);
            oneSecondRepeatingRectangle.Fill   = mySolidColorBrush;
            oneSecondRepeatingRectangle.Width  = 50;
            oneSecondRepeatingRectangle.Height = 20;
            oneSecondRepeatingRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(oneSecondRepeatingRectangle);

            StackPanel myStackPanel1 = new StackPanel();

            myStackPanel.Children.Add(myStackPanel1);
            myStackPanel1.Orientation = Orientation.Horizontal;
            myStackPanel1.Margin      = new Thickness(0, 20, 0, 0);

            //
            // Create an animation that repeats indefinitely.
            //
            DoubleAnimation myForeverRepeatingDoubleAnimation = new DoubleAnimation();

            Storyboard.SetTargetName(myForeverRepeatingDoubleAnimation, foreverRepeatingRectangle.Name);
            Storyboard.SetTargetProperty(myForeverRepeatingDoubleAnimation,
                                         new PropertyPath(Rectangle.WidthProperty));
            myForeverRepeatingDoubleAnimation.From           = 50;
            myForeverRepeatingDoubleAnimation.To             = 300;
            myForeverRepeatingDoubleAnimation.Duration       = new Duration(TimeSpan.FromMilliseconds(2000));
            myForeverRepeatingDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;


            //
            //  Create an animation that repeats for four seconds.
            //      As a result,the animation repeats twice.
            DoubleAnimation myFourSecondsRepeatingDoubleAnimation = new DoubleAnimation();

            Storyboard.SetTargetName(myFourSecondsRepeatingDoubleAnimation,
                                     fourSecondsRepeatingRectangle.Name);
            Storyboard.SetTargetProperty(myFourSecondsRepeatingDoubleAnimation,
                                         new PropertyPath(Rectangle.WidthProperty));
            myFourSecondsRepeatingDoubleAnimation.From     = 50;
            myFourSecondsRepeatingDoubleAnimation.To       = 300;
            myFourSecondsRepeatingDoubleAnimation.Duration =
                new Duration(TimeSpan.FromMilliseconds(2000));
            myFourSecondsRepeatingDoubleAnimation.RepeatBehavior =
                new RepeatBehavior(TimeSpan.FromMilliseconds(4000));

            //
            // Create an animation that repeats twice.
            //
            DoubleAnimation myTwiceRepeatingDoubleAnimation = new DoubleAnimation();

            Storyboard.SetTargetName(myTwiceRepeatingDoubleAnimation, twiceRepeatingRectangle.Name);
            Storyboard.SetTargetProperty(myTwiceRepeatingDoubleAnimation,
                                         new PropertyPath(Rectangle.WidthProperty));
            myTwiceRepeatingDoubleAnimation.From           = 50;
            myTwiceRepeatingDoubleAnimation.To             = 300;
            myTwiceRepeatingDoubleAnimation.Duration       = new Duration(TimeSpan.FromMilliseconds(2000));
            myTwiceRepeatingDoubleAnimation.RepeatBehavior = new RepeatBehavior(2);


            //
            // Create an animation that repeats 0.5 times. The resulting animation plays for one second,
            //   half of its Duration. It animates from 50 to 150.
            DoubleAnimation myHalfRepeatingDoubleAnimation = new DoubleAnimation();

            Storyboard.SetTargetName(myHalfRepeatingDoubleAnimation, halfRepeatingRectangle.Name);
            Storyboard.SetTargetProperty(myHalfRepeatingDoubleAnimation,
                                         new PropertyPath(Rectangle.WidthProperty));
            myHalfRepeatingDoubleAnimation.From           = 50;
            myHalfRepeatingDoubleAnimation.To             = 300;
            myHalfRepeatingDoubleAnimation.Duration       = new Duration(TimeSpan.FromMilliseconds(2000));
            myHalfRepeatingDoubleAnimation.RepeatBehavior = new RepeatBehavior(0.5);

            //
            //  Create an animation that repeats for one second. The resulting animation
            //       plays for one second, half of its Duration. It animates from 50 to 150.
            DoubleAnimation myOneSecondDoubleAnimation = new DoubleAnimation();

            Storyboard.SetTargetName(myOneSecondDoubleAnimation, oneSecondRepeatingRectangle.Name);
            Storyboard.SetTargetProperty(myOneSecondDoubleAnimation,
                                         new PropertyPath(Rectangle.WidthProperty));
            myOneSecondDoubleAnimation.From           = 50;
            myOneSecondDoubleAnimation.To             = 300;
            myOneSecondDoubleAnimation.Duration       = new Duration(TimeSpan.FromMilliseconds(2000));
            myOneSecondDoubleAnimation.RepeatBehavior =
                new RepeatBehavior(TimeSpan.FromMilliseconds(1000));

            //
            //  Create a Storyboard to contain the animations and add the animations to the Storyboard
            //
            Storyboard myStoryboard = new Storyboard();

            myStoryboard.Children.Add(myForeverRepeatingDoubleAnimation);
            myStoryboard.Children.Add(myFourSecondsRepeatingDoubleAnimation);
            myStoryboard.Children.Add(myTwiceRepeatingDoubleAnimation);
            myStoryboard.Children.Add(myHalfRepeatingDoubleAnimation);
            myStoryboard.Children.Add(myOneSecondDoubleAnimation);

            //
            //  Create buttons to restart and stop the animations.
            //
            Button myRestartButton = new Button();

            myRestartButton.Name = "restartButton";
            this.RegisterName(myRestartButton.Name, myRestartButton);
            myRestartButton.Content = "Start Animations";
            myStackPanel1.Children.Add(myRestartButton);

            Button myStopButton = new Button();

            myStopButton.Name = "stopButton";
            this.RegisterName(myStopButton.Name, myStopButton);
            myStopButton.Content    = "Stop";
            mySolidColorBrush       = new SolidColorBrush(Color.FromArgb(102, 153, 0, 255));
            myStopButton.Background = mySolidColorBrush;
            myStackPanel1.Children.Add(myStopButton);

            //
            //  Create EventTriggers and the BeginStoryboard and StopStoryboard actions to start
            //    and stop the storyboard.
            BeginStoryboard myBeginStoryboard = new BeginStoryboard();

            myBeginStoryboard.Name = "myBeginStoryboard";
            this.RegisterName(myBeginStoryboard.Name, myBeginStoryboard);
            myBeginStoryboard.Storyboard = myStoryboard;

            EventTrigger myEventTrigger = new EventTrigger();

            myEventTrigger.RoutedEvent = Button.ClickEvent;
            myEventTrigger.SourceName  = myRestartButton.Name;
            myEventTrigger.Actions.Add(myBeginStoryboard);
            myStackPanel.Triggers.Add(myEventTrigger);

            EventTrigger myEventTrigger1 = new EventTrigger();

            myEventTrigger1.RoutedEvent = Button.ClickEvent;
            myEventTrigger1.SourceName  = myStopButton.Name;

            StopStoryboard myStopStoryboard = new StopStoryboard();

            myStopStoryboard.BeginStoryboardName = myBeginStoryboard.Name;
            myEventTrigger1.Actions.Add(myStopStoryboard);
            myStackPanel.Triggers.Add(myEventTrigger1);
        }
Exemplo n.º 2
0
        public override void OnApplyTemplate()
        {
            this.CombateGrid = this.GetTemplateChild("CombateGrid") as Grid;
            if (this.CombateGrid == null)
            {
                return;
            }

            foreach (BoardField field in Board.Layout)
            {
                var rect = new Rectangle
                {
                    Stroke = Brushes.Black,
                };

                var rectStyle = new Style(typeof(Rectangle));

                var defaultFill            = new Setter(Shape.FillProperty, Brushes.Transparent);
                var defaultStrokethickness = new Setter(Shape.StrokeThicknessProperty, 1.0);
                var defaultHitTest         = new Setter(IsHitTestVisibleProperty, true);

                rectStyle.Setters.Add(defaultFill);
                rectStyle.Setters.Add(defaultStrokethickness);
                rectStyle.Setters.Add(defaultHitTest);

                var unwalkableFill            = new Setter(Shape.FillProperty, Brushes.Blue);
                var unwalkableStrokeThickness = new Setter(Shape.StrokeThicknessProperty, 0.0);
                var unwalkableHitTest         = new Setter(IsHitTestVisibleProperty, false);
                var unwalkableTrigger         = new DataTrigger
                {
                    Binding = new Binding("IsWalkable")
                    {
                        Source = field
                    },
                    Value = false
                };
                unwalkableTrigger.Setters.Add(unwalkableFill);
                unwalkableTrigger.Setters.Add(unwalkableStrokeThickness);
                unwalkableTrigger.Setters.Add(unwalkableHitTest);

                var attackableFill = new Setter
                {
                    Property = Shape.FillProperty,
                    Value    = Brushes.Red
                };
                var atackableTrigger = new DataTrigger
                {
                    Binding = new Binding("IsAttackable")
                    {
                        Source = field
                    },
                    Value = true
                };
                atackableTrigger.Setters.Add(attackableFill);

                var enabledFill = new Setter
                {
                    Property = Shape.FillProperty,
                    Value    = Brushes.SpringGreen
                };
                var enabledTrigger = new DataTrigger
                {
                    Binding = new Binding("IsEnabled")
                    {
                        Source = field
                    },
                    Value = true
                };
                enabledTrigger.Setters.Add(enabledFill);

                rectStyle.Triggers.Add(unwalkableTrigger);
                rectStyle.Triggers.Add(atackableTrigger);
                rectStyle.Triggers.Add(enabledTrigger);

                rect.Style = rectStyle;

                var clickDownEvent = new EventToCommand
                {
                    Command          = this.Vm.FieldClickDownCommand,
                    CommandParameter = field
                };
                var triggerEvent = new InteractiveEventTrigger
                {
                    EventName = "MouseLeftButtonDown",
                };
                triggerEvent.Actions.Add(clickDownEvent);
                TriggerCollection triggers = Interaction.GetTriggers(rect);
                triggers.Add(triggerEvent);

                Grid.SetColumn(rect, field.Column);
                Grid.SetRow(rect, field.Row);
                Panel.SetZIndex(rect, 1);
                this.CombateGrid.Children.Add(rect);
            }

            foreach (BoardPiece piece in SelfPlayer.Army)
            {
                var button = new Button
                {
                    BorderThickness  = new Thickness(3),
                    BorderBrush      = Brushes.Black,
                    FontWeight       = FontWeights.Bold,
                    Command          = this.Vm.PieceClickCommand,
                    CommandParameter = piece
                };

                var buttonStyle = new Style(typeof(Button))
                {
                    BasedOn = FindResource("MetroCircleButtonStyle") as Style
                };

                var defaultBackground = new Setter(BackgroundProperty, Brushes.Gray);
                var defaultVisibility = new Setter(VisibilityProperty, Visibility.Collapsed);
                var defaultEffect     = new Setter(EffectProperty, null);
                var defaultForeground = new Setter(ForegroundProperty, Brushes.Black);
                var defaultFontSize   = new Setter(FontSizeProperty, 12.0);

                buttonStyle.Setters.Add(defaultBackground);
                buttonStyle.Setters.Add(defaultVisibility);
                buttonStyle.Setters.Add(defaultEffect);
                buttonStyle.Setters.Add(defaultForeground);
                buttonStyle.Setters.Add(defaultFontSize);

                var player1Setter = new Setter(BackgroundProperty, TryFindResource("Player1Brush"));
                var player2Setter = new Setter(BackgroundProperty, TryFindResource("Player2Brush"));

                var isOpponentCondition = new Condition
                {
                    Binding = new Binding("IsOpponent")
                    {
                        Source = piece
                    },
                    Value = true
                };
                var isSelfPlayerCondition = new Condition
                {
                    Binding = new Binding("IsOpponent")
                    {
                        Source = piece
                    },
                    Value = false
                };
                var opponentIsPlayer1 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.Opponent
                    },
                    Value = false
                };
                var selfPlayerIsPlayer1 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.SelfPlayer
                    },
                    Value = false
                };
                var opponentIsPlayer2 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.Opponent
                    },
                    Value = true
                };
                var selfPlayerIsPlayer2 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.SelfPlayer
                    },
                    Value = true
                };

                var player1Trigger1 = new MultiDataTrigger();
                player1Trigger1.Conditions.Add(isOpponentCondition);
                player1Trigger1.Conditions.Add(opponentIsPlayer1);
                player1Trigger1.Setters.Add(player1Setter);

                var player1Trigger2 = new MultiDataTrigger();
                player1Trigger2.Conditions.Add(isSelfPlayerCondition);
                player1Trigger2.Conditions.Add(selfPlayerIsPlayer1);
                player1Trigger2.Setters.Add(player1Setter);

                var player2Trigger1 = new MultiDataTrigger();
                player2Trigger1.Conditions.Add(isOpponentCondition);
                player2Trigger1.Conditions.Add(opponentIsPlayer2);
                player2Trigger1.Setters.Add(player2Setter);

                var player2Trigger2 = new MultiDataTrigger();
                player2Trigger2.Conditions.Add(isSelfPlayerCondition);
                player2Trigger2.Conditions.Add(selfPlayerIsPlayer2);
                player2Trigger2.Setters.Add(player2Setter);

                var visibilitySetter  = new Setter(VisibilityProperty, Visibility.Visible);
                var visibilityTrigger = new DataTrigger
                {
                    Binding = new Binding("IsAlive")
                    {
                        Source = piece
                    },
                    Value = true
                };
                visibilityTrigger.Setters.Add(visibilitySetter);

                var effectSetter  = new Setter(EffectProperty, new DropShadowEffect());
                var effectTrigger = new DataTrigger
                {
                    Binding = new Binding("IsSelected")
                    {
                        Source = piece
                    },
                    Value = true
                };
                effectTrigger.Setters.Add(effectSetter);

                var onAttackFontSizeSetter = new Setter(FontSizeProperty, button.FontSize * 2.0);

                var winningForegroundSetter = new Setter(ForegroundProperty, Brushes.Green);
                var winningTrigger          = new DataTrigger
                {
                    Binding = new Binding("IsDefeating")
                    {
                        Source = piece
                    },
                    Value = true
                };
                winningTrigger.Setters.Add(onAttackFontSizeSetter);
                winningTrigger.Setters.Add(winningForegroundSetter);

                var defeatStoryboard = new Storyboard
                {
                    AccelerationRatio = 0.2
                };
                defeatStoryboard.Completed += (s, _) => DefeatStoryboard_Completed();
                var defeatAnimation = new DoubleAnimation(0.1, new TimeSpan(0, 0, 0, 2, 0));
                Storyboard.SetTarget(defeatAnimation, button);
                Storyboard.SetTargetProperty(defeatAnimation, new PropertyPath(FontSizeProperty));
                defeatStoryboard.Children.Add(defeatAnimation);
                var beginSb = new BeginStoryboard
                {
                    Storyboard = defeatStoryboard,
                    Name       = "DefeatStoryboard"
                };
                var stopSb = new StopStoryboard
                {
                    BeginStoryboardName = beginSb.Name
                };
                var losingForegroundSetter = new Setter(ForegroundProperty, Brushes.Red);
                var losingTrigger          = new DataTrigger
                {
                    Binding = new Binding("IsBeingDefeated")
                    {
                        Source = piece
                    },
                    Value = true
                };
                losingTrigger.EnterActions.Add(beginSb);
                losingTrigger.ExitActions.Add(stopSb);
                losingTrigger.Setters.Add(onAttackFontSizeSetter);
                losingTrigger.Setters.Add(losingForegroundSetter);

                buttonStyle.Triggers.Add(player1Trigger1);
                buttonStyle.Triggers.Add(player1Trigger2);
                buttonStyle.Triggers.Add(player2Trigger1);
                buttonStyle.Triggers.Add(player2Trigger2);
                buttonStyle.Triggers.Add(visibilityTrigger);
                buttonStyle.Triggers.Add(effectTrigger);
                buttonStyle.Triggers.Add(winningTrigger);
                buttonStyle.Triggers.Add(losingTrigger);

                buttonStyle.RegisterName(beginSb.Name, beginSb);
                button.Style = buttonStyle;

                ApplyBinding("Column", piece, button, Grid.ColumnProperty);
                ApplyBinding("Row", piece, button, Grid.RowProperty);
                ApplyBinding("PowerLevel", piece, button, ContentProperty);

                Panel.SetZIndex(button, 2);
                this.CombateGrid.Children.Add(button);
            }

            foreach (BoardPiece piece in Opponent.Army)
            {
                var button = new Button
                {
                    Effect           = null,
                    BorderThickness  = new Thickness(3),
                    BorderBrush      = Brushes.Black,
                    FontWeight       = FontWeights.Bold,
                    IsHitTestVisible = false
                };

                var buttonStyle = new Style(typeof(Button))
                {
                    BasedOn = FindResource("MetroCircleButtonStyle") as Style
                };

                var defaultBackground = new Setter(BackgroundProperty, Brushes.Gray);
                var defaultVisibility = new Setter(VisibilityProperty, Visibility.Collapsed);
                var defaultForeground = new Setter(ForegroundProperty, Brushes.Black);
                var defaultFontSize   = new Setter(FontSizeProperty, 12.0);

                buttonStyle.Setters.Add(defaultBackground);
                buttonStyle.Setters.Add(defaultVisibility);
                buttonStyle.Setters.Add(defaultForeground);
                buttonStyle.Setters.Add(defaultFontSize);

                var player1Setter = new Setter(BackgroundProperty, TryFindResource("Player1Brush"));
                var player2Setter = new Setter(BackgroundProperty, TryFindResource("Player2Brush"));

                var isOpponentCondition = new Condition
                {
                    Binding = new Binding("IsOpponent")
                    {
                        Source = piece
                    },
                    Value = true
                };
                var isSelfPlayerCondition = new Condition
                {
                    Binding = new Binding("IsOpponent")
                    {
                        Source = piece
                    },
                    Value = false
                };
                var opponentIsPlayer1 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.Opponent
                    },
                    Value = false
                };
                var selfPlayerIsPlayer1 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.SelfPlayer
                    },
                    Value = false
                };
                var opponentIsPlayer2 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.Opponent
                    },
                    Value = true
                };
                var selfPlayerIsPlayer2 = new Condition
                {
                    Binding = new Binding("IsPlayer2")
                    {
                        Source = this.Vm.SelfPlayer
                    },
                    Value = true
                };

                var player1Trigger1 = new MultiDataTrigger();
                player1Trigger1.Conditions.Add(isOpponentCondition);
                player1Trigger1.Conditions.Add(opponentIsPlayer1);
                player1Trigger1.Setters.Add(player1Setter);

                var player1Trigger2 = new MultiDataTrigger();
                player1Trigger2.Conditions.Add(isSelfPlayerCondition);
                player1Trigger2.Conditions.Add(selfPlayerIsPlayer1);
                player1Trigger2.Setters.Add(player1Setter);

                var player2Trigger1 = new MultiDataTrigger();
                player2Trigger1.Conditions.Add(isOpponentCondition);
                player2Trigger1.Conditions.Add(opponentIsPlayer2);
                player2Trigger1.Setters.Add(player2Setter);

                var player2Trigger2 = new MultiDataTrigger();
                player2Trigger2.Conditions.Add(isSelfPlayerCondition);
                player2Trigger2.Conditions.Add(selfPlayerIsPlayer2);
                player2Trigger2.Setters.Add(player2Setter);

                var visibilitySetter  = new Setter(VisibilityProperty, Visibility.Visible);
                var visibilityTrigger = new DataTrigger
                {
                    Binding = new Binding("IsAlive")
                    {
                        Source = piece
                    },
                    Value = true
                };
                visibilityTrigger.Setters.Add(visibilitySetter);

                var onAttackFontSizeSetter = new Setter(FontSizeProperty, button.FontSize * 2);

                var winningForegroundSetter = new Setter(ForegroundProperty, Brushes.Green);
                var winningTrigger          = new DataTrigger
                {
                    Binding = new Binding("IsDefeating")
                    {
                        Source = piece
                    },
                    Value = true
                };
                winningTrigger.Setters.Add(onAttackFontSizeSetter);
                winningTrigger.Setters.Add(winningForegroundSetter);

                var defeatStoryboard = new Storyboard
                {
                    AccelerationRatio = 0.2
                };
                defeatStoryboard.Completed += (s, _) => DefeatStoryboard_Completed();
                var defeatAnimation = new DoubleAnimation(0.1, new TimeSpan(0, 0, 0, 2, 0));
                Storyboard.SetTarget(defeatAnimation, button);
                Storyboard.SetTargetProperty(defeatAnimation, new PropertyPath(FontSizeProperty));
                defeatStoryboard.Children.Add(defeatAnimation);
                var beginSb = new BeginStoryboard
                {
                    Storyboard = defeatStoryboard,
                    Name       = "DefeatStoryboard"
                };
                var stopSb = new StopStoryboard
                {
                    BeginStoryboardName = beginSb.Name
                };
                var losingForegroundSetter = new Setter(ForegroundProperty, Brushes.Red);
                var losingTrigger          = new DataTrigger
                {
                    Binding = new Binding("IsBeingDefeated")
                    {
                        Source = piece
                    },
                    Value = true
                };
                losingTrigger.EnterActions.Add(beginSb);
                losingTrigger.ExitActions.Add(stopSb);
                losingTrigger.Setters.Add(onAttackFontSizeSetter);
                losingTrigger.Setters.Add(losingForegroundSetter);

                buttonStyle.Triggers.Add(player1Trigger1);
                buttonStyle.Triggers.Add(player1Trigger2);
                buttonStyle.Triggers.Add(player2Trigger1);
                buttonStyle.Triggers.Add(player2Trigger2);
                buttonStyle.Triggers.Add(visibilityTrigger);
                buttonStyle.Triggers.Add(winningTrigger);
                buttonStyle.Triggers.Add(losingTrigger);

                buttonStyle.RegisterName(beginSb.Name, beginSb);
                button.Style = buttonStyle;

                ApplyBinding("Column", piece, button, Grid.ColumnProperty);
                ApplyBinding("Row", piece, button, Grid.RowProperty);
                ApplyBinding("PowerLevel", piece, button, ContentProperty);

                Panel.SetZIndex(button, 2);
                this.CombateGrid.Children.Add(button);
            }

            this.CombateGridChildren = this.CombateGrid.Children.Cast <UIElement>();

            base.OnApplyTemplate();
        }