1

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

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

4

1 回答 1

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

于 2013-05-07T20:06:27.130 回答