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