将 Silverlight 故事板移植到 WPF

Port Silverlight Storyboard to WPF

尝试将旧 Silverlight 应用程序的一些行为移植到 WPF,该应用程序允许用户通过 moving/minimizing/maximizing 各种 UserControls 配置他们的视图。在 UserControl.Resources 中声明了几个 StoryBoard,然后通过它们的 x:Name.

从代码中访问
<Storyboard x:Name="MaximizeStoryboard" Completed="MaximizeStoryboard_Completed" Storyboard.TargetName="WholeControl">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(FrameworkElement.Width)">
                <SplineDoubleKeyFrame x:Name="MaximizeWidth" KeyTime="00:00:00.3000000" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
...

在 WPF 中,将 x:Name 更改为 x:Key 后,我可以通过以下方式访问 Storyboard:

Storyboard maximizeStoryboard = (Storyboard)Resources["MaximizeStoryboard"];

以前用过

MaximizeWidth.Value = Container.Contents.ActualWidth;

在开始动画之前,通过代码设置恢复宽度(和其他值)。这在 WPF 中不起作用。获得访问权以便可以从代码设置这些值的正确方法是什么?

一种可能的方法是通过Storyboard的children,找到DoubleAnimationUsingKeyFrameschild,然后得到第一个KeyFrame

Storyboard maximizeStoryboard = (Storyboard)Resources["MaximizeStoryboard"];
var doubleAnimationUsingKeyFrames = maximizeStoryboard.Children.OfType<DoubleAnimationUsingKeyFrames>().FirstOrDefault();
if (doubleAnimationUsingKeyFrames != null)
{
    if (doubleAnimationUsingKeyFrames.KeyFrames.Count > 0)
    {
        var keyFrame = doubleAnimationUsingKeyFrames.KeyFrames[0] as SplineDoubleKeyFrame;
        if(keyFrame !=null)
        {
            keyFrame.Value = Container.Contents.ActualWidth;
        }
    }
}