我想在我的WPF应用程序中定义SolidColorBrush
作为资源(或者更确切地说是在多个应用程序可能引用的程序集中)。
在某些主题中,我希望在构成主题的资源字典中明确定义此颜色,但在例如经典主题中,我希望此颜色为系统颜色。
例如:
Aero.NormalColor.xaml :
<SolidColorBrush
x:Key="{ComponentResourceKey
TypeInTargetAssembly={x:Type l:MyClass},
ResourceId=MyColor}"
Color="#FF3399FF"/>
Classic.xaml:
<SolidColorBrush
x:Key="{ComponentResourceKey
TypeInTargetAssembly={x:Type l:MyClass},
ResourceId=MyColor}"
Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}"/>
然后,我的应用程序可以通过名称MyColor
使用此画笔,以便可以在主题级别重新定义它。如果定义如上,当颜色被定义为文字时(即使用Aero主题时),一切都可以正常工作,但是当引用SystemColors
动态资源时(在Classic.xaml中),我得到一个异常说<在应用程序启动期间,“这个freezable无法冻结”。 (至少如果我定义了几个这样的画笔,它似乎在某些情况下有用,例如当只使用一种颜色时,但它看起来似乎不太稳定。
修改 用法如下:
<Border Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type l:MyClass}, ResourceId=MyColor}}">
似乎并不容易重现。当我刚刚用这两种颜色创建一个主题文件,并且在Grid
中运行一个带有上面一行的空窗口时,程序运行,但Visual Studio中的设计器会抛出上面的异常。不太确定如何创建一个在运行时重现它的最小示例。
那么如何防止发生此错误,或者我应该使用什么方法来实现我的目标呢?
答案 0 :(得分:2)
您真的需要动态链接到系统颜色吗?你尝试过设置静态资源吗?我的意思是改变
Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}
到
Color="{StaticResource {x:Static SystemColors.HighlightColorKey}}
有意义吗?