Значение цвета привязки для колоранимации - PullRequest
2 голосов
/ 30 августа 2011

У меня есть Border, и я пытаюсь сделать так, чтобы BorderBrush Flashes "Fade in and out". Но моя проблема в том, что цвет Flasing зависит от кода. так что цвет изменится, но я должен держать затухание / исчезновение навсегда, изменив цвет «От» этой границы.

Я пробовал двумя способами: 1: привязка цвета напрямую, но потом я знаю, что есть замерзшая вещь, которую необходимо применить к цвету:

<Border  Grid.Column="1" Grid.Row="2" Name="ActiveBorder"  VerticalAlignment="Stretch"   Height="auto"  BorderBrush="SteelBlue" BorderThickness="2">
    <Border.Style>
        <Style TargetType="{x:Type Border}">
            <Style.Triggers>
                <Trigger Property="Visibility" Value="Visible">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetProperty="BorderBrush.Color" Duration="00:00:01" From="{Binding RelativeSource={RelativeSource Self}, Path=FlashBrush}" To="SteelBlue" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

2: запуск и остановка анимации из кода при изменении цвета:

<Border Grid.Column="1" Grid.Row="2" Name="ActiveBorder"  VerticalAlignment="Stretch" Height="auto"  BorderBrush="SteelBlue" BorderThickness="2" >
    <Border.Resources>
        <Storyboard x:Key="tt" x:Name="tt">
            <ColorAnimation AutoReverse="True" RepeatBehavior="Forever" Storyboard.TargetProperty="BorderBrush.Color" Duration="00:00:01" 
                            From="{Binding RelativeSource={RelativeSource Self}, Path=FlashBrush}"  To="SteelBlue" />
        </Storyboard>
    </Border.Resources>
</Border>

код:

Storyboard storyBoard = ActiveBorder.Resources["tt"] as Storyboard;
storyBoard.Stop();
switch (value)
{
   case ElementStatus.Active:
        FlashBrush = Brushes.LawnGreen;
        break;
   case ElementStatus.Hold:
        FlashBrush = Brushes.Blue;
        break;
   default:
        FlashBrush = Brushes.SteelBlue;
        break;
}
storyBoard.Begin(ActiveBorder);

Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 31 августа 2011

Я нашел решение: мы должны сделать это в коде.без привязки.

ColorAnimation myColorAnimation;
public void ChangeAnimationColor(SolidColorBrushFlashBrush)
{
     myColorAnimation = new ColorAnimation();
     myColorAnimation.From = FlashBrush.Color; // the wanted new color 
     myColorAnimation.To = Colors.Transparent;  
     myColorAnimation.AutoReverse = true;
     myColorAnimation.RepeatBehavior = RepeatBehavior.Forever;
     myColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
     Storyboard.SetTargetName(myColorAnimation, "MySolidColorBrush");             
     Storyboard.SetTargetProperty(myColorAnimation,
                         new PropertyPath(SolidColorBrush.ColorProperty));
     Storyboard myStoryboard = new Storyboard();              
     myStoryboard.Children.Add(myColorAnimation);
     myStoryboard.Begin(this);
}

и XML:

<Border   Name="ActiveBorder"  BorderThickness="2" >
<Border.BorderBrush>
<SolidColorBrush x:Name="MySolidColorBrush" Color="Transparent" />
</Border.BorderBrush>
... Add what ever you want to the Border.
</Border>
...