相关文章推荐
暗恋学妹的红金鱼  ·  Android ...·  2 月前    · 
健壮的饭盒  ·  python - ...·  1 年前    · 
WPF 调用 Storyboard报错 “'System.Windows.Media.Animation.Storyboard' 的指定值必须将 IsFrozen 设置为 false 才能修改

WPF 调用 Storyboard报错 “'System.Windows.Media.Animation.Storyboard' 的指定值必须将 IsFrozen 设置为 false 才能修改

今天在WPF 项目中自定义弹出窗口时,打开关闭窗口过渡太生硬,所以加了过渡动画。打开窗口动画正常,但是关闭的时候报错。

“System.InvalidOperationException: 类型为'System.Windows.Media.Animation.Storyboard' 的指定值必须将 IsFrozen 设置为 false 才能修改

代码如下

动画资源代码:

<Storyboard x:Key="HideWindow">
        <DoubleAnimation
            FillBehavior="Stop"
            Storyboard.TargetProperty="Opacity"
            From="1"
            To="0"
            Duration="0:0:0.2" />
    </Storyboard>

后台关闭窗口执行动画

[RelayCommand]
void Close()
    var story = (Storyboard)App.Current.Resources["HideWindow"];
    if (story != null)
        story.Completed += delegate { App.DialogWindow.Close(); };
        story.Begin(App.DialogWindow);
}

解决方案1:

解决思路:只需将故事板更改为不共享即可为每个动画调用创建故事板,从而消除此错误。所以在定义演示画板Storyboard 时候,设置属性 x:Shared="False" , 代码如下:

 <Storyboard x:Key="HideWindow" x:Shared="False">
        <DoubleAnimation
            FillBehavior="Stop"
            Storyboard.TargetProperty="Opacity"
            From="1"
            To="0"
            Duration="0:0:0.2" />
    </Storyboard>

解决方案2:

解决思路:不需要再定义演示画板Storyboard 时候不需要设置共享属性,而是在执行动画时克隆一个实例,代码如下

[RelayCommand]
void Close()
    var story = (Storyboard)App.Current.Resources["HideWindow"];
    story = story.Clone();