在WPF中将颜色定义为主题中的系统颜色

时间:2013-05-04 20:56:16

标签: .net wpf

我想在我的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中的设计器会抛出上面的异常。不太确定如何创建一个在运行时重现它的最小示例。

那么如何防止发生此错误,或者我应该使用什么方法来实现我的目标呢?

1 个答案:

答案 0 :(得分:2)

您真的需要动态链接到系统颜色吗?你尝试过设置静态资源吗?我的意思是改变

Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}

Color="{StaticResource {x:Static SystemColors.HighlightColorKey}}

有意义吗?

似乎是设计的:http://www.vistax64.com/avalon/263-freezable-can-not-frozen-dynamicresource-x-static-systemcolors-controldarkdarkcolorkey.html