wpf 是否可以在样式或控件模板中包含的情节提要中使用动态资源

mcdcgff0  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(153)

我正在尝试使用ControlTemplate内包含的情节提要中的DynamicResource。
但是,当我尝试这样做时,我得到一个“无法冻结此情节提要时间线树以跨线程使用”错误。
这是怎么回事?

ergxz8rk

ergxz8rk1#

不能,不能在包含在Style或ControlTemplate中的分镜脚本中使用DynamicResource。事实上,也不能使用数据绑定表达式。
这里的情况是,Style或ControlTemplate中的所有内容都必须安全地跨线程使用,计时系统实际上会尝试冻结Style或ControlTemplate以使它们成为线程安全的。但是,如果存在DynamicResource或数据绑定表达式,它就无法冻结它们。
如需更多信息,请参阅:MSDN Link。请查看“在样式中动画”和“在控件模板中动画”部分(此文档页相当长)。
有关解决方法(至少对于我的场景),请参见:是的。
希望这能帮上忙。我掉的头发已经够多了。
科里

9q78igpj

9q78igpj2#

在某些情况下,有一种解决方法:

  • 引入附加属性,
  • 使用所需setter为引入的属性指定样式触发器
rjjhvcjd

rjjhvcjd3#

虽然你可以在ControlTemplate中有DynamicResource,但你不能在StoryBoard中有一个。
我用Opacity(或Visibility)解决了这个问题。你可以在ControlTemplate中添加两个元素。每个元素使用一个DynamicResources,但只有一个是可见的。你可以通过Storyboard设置每个元素的VisibilityOpacity

9q78igpj

9q78igpj4#

简单的解决方案是在代码中使用sb

public static void ColorAnimation(FrameworkElement Obj,  string From, string To, int Milliseconds)
    {
        Color from = ( Color )ColorConverter.ConvertFromString( From );
        Color to = ( Color )ColorConverter.ConvertFromString( To );
        {
            ColorAnimation animation = new ColorAnimation();
            animation.From = from;
            animation.To = to;
            animation.Duration = new Duration( TimeSpan.FromMilliseconds( Milliseconds ) );
            Storyboard.SetTargetProperty( animation, new PropertyPath( "(Grid.Background).(SolidColorBrush.Color)", null ) );
            Storyboard storyboard = new Storyboard();
            storyboard.Children.Add( animation );
            storyboard.Begin( Obj );
        }
    }

在mouse_leave事件中使用:(或也可在mouse_enter中使用)
如果(你的主题决定因素1)彩色动画(最小化按钮,“#FF333333”,“#00202020”,150);如果(你的主题决定因素2)彩色动画(最小化按钮,“#FF32506E”,“#0032506E”,200);
等等。

相关问题