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

  • 本文关键字:颜色 系统 定义 WPF .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)我得到一个异常说"这个冻结不能被冻结"在应用程序启动期间。(至少如果我有几个这样的画笔定义,它似乎在某些情况下工作,比如当只使用一种颜色,但它似乎不是很稳定。

编辑:

它的用法类似于:

<Border Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type l:MyClass}, ResourceId=MyColor}}">

这似乎并不容易复制。当我用这两种颜色创建了一个主题文件,并在Grid中创建了一个空窗口,程序运行了,但是Visual Studio中的设计器却抛出了上面的异常。不太确定如何创建一个最小的示例,在运行时重现此

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

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

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

最新更新