从代码隐藏 (xaml.cs) 开始故事板,而不是从视图模型 MVVM

Start a storyboard from code-behind (xaml.cs), not from view model MVVM

在 WPF 中,我为边框设置了以下样式:

<Style TargetType="Border" x:Key="BorderBlinking">
    <Style.Triggers>
        <DataTrigger Binding="{Binding PopupBlinking}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>                                
                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         To="0" AutoReverse="True" Duration="0:0:0.5" SpeedRatio="3" RepeatBehavior="3x" />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         To="1" AutoReverse="True" Duration="0:0:0.5" />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

然后我像这样附加到边框上:

<Border Grid.Row="2" x:Name="popup" 
        Style="{StaticResource BorderBlinking}"
        CornerRadius="10,10,0,0" Height="25" Margin="0"
        HorizontalAlignment="Center" Width="Auto"
        VerticalAlignment="Center"
        BorderBrush="DarkBlue" BorderThickness="1"
        Background="AntiqueWhite">
    <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center">
        <Image Source="Common.Images;component/Images/Info.png" Height="20" Width="20" Stretch="Fill"/>
        <TextBlock Margin="5" VerticalAlignment="Center" HorizontalAlignment="Left" 
       Background="Transparent" FontSize="12"><Run Text="this is a custom popup"/></TextBlock>
    </StackPanel>
</Border>

然后我想从我后面的代码(不是视图模型)开始故事板。我知道如何通过绑定到数据触发器的 属性 "PopupBlinking"(如上例所示)从视图模型启动它,但现在我需要知道如何从代码隐藏(不是视图模型)启动它).

我修改了上面的代码并完成了下面的代码:

        <Storyboard x:Key="Blink" >
            <DoubleAnimation Storyboard.TargetProperty="Opacity" 
                                                 To="0" AutoReverse="True" Duration="0:0:0.5" SpeedRatio="3" RepeatBehavior="3x" />
            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                                 To="1" AutoReverse="True" Duration="0:0:0.5" />
        </Storyboard>

来自代码隐藏:

        Storyboard sb = Resources["Blink"] as Storyboard;            
        sb.Begin(this.popup);

这是正确的做法吗?

你可以这样直接启动动画:

popup.BeginAnimation(UIElement.OpacityProperty,
    new DoubleAnimation
    {
        To = 0,
        Duration = TimeSpan.FromSeconds(0.5),
        AutoReverse = true,
        RepeatBehavior = RepeatBehavior.Forever
    });