动态颜色资源在WPF中行事奇怪

动态颜色资源在WPF中行事奇怪

问题描述:

在我的应用程序中,我有一大堆字典中定义的资源,它们都被合并到App.xaml中,并且一切正常。不过,我一直在尝试添加第二个主题到我的应用程序。我有一个默认的点定义的所有的刷子,每主题定义颜色:动态颜色资源在WPF中行事奇怪

在共享Brushes.xaml:

<SolidColorBrush x:Key="ForegroundBrush" Color="{DynamicResource ForegroundColor}" /> 

然后,每个主题都有Colors.xaml字典,所有的色彩定义:

<Color x:Key="ForegroundColor">#FF112233</Color> 

一个基地字典ResourceLibrary.xaml合并所有的样式,刷子等一起,然后获取合并成的App.xaml,并Colors.xaml得到由主题管理合并到的App.xaml(Infragistics的,但我也尝试手动合并它)。像这样,什么都没有出现。但是,如果我将ResourceLibrary.xaml合并到我的视图中,则所有内容都显示在该视图上。当我没有合并它并且我看不到任何东西时,我仍然可以使用Live Visual Tree来查找控件,并且它们应用了所有正确的样式和所有内容,包括正确的画笔及其预期的资源键。 ..但是然后颜色总是#00FFFFFF(我认为它是Color的默认值)。所以它能够找到从App.xaml到颜色的所有内容,但似乎无法找到颜色。

这里有另一个有趣的事情要注意...如果我将ResourceLibrary.xaml合并到我的窗口,然后在窗口上托管另一个用户控件,用户控件可以访问所有颜色,除了正在使用的主窗口。如果画笔没有在窗口上使用,它将在用户控件上正确显示,如果它被窗口使用,则窗口将正确显示,但在用户控件中它具有#00FFFFFF颜色。

现在我已经三天抨击我的头并且已经多次走完整圈,现在我完全没有想法。任何帮助将不胜感激。

+0

是其他主题也被“合并”与潜在的名字App.xaml中的资源字典碰撞?所有控件的样式模板都绑定回“Foreground Brush”作为模板级Foreground的静态资源? –

+0

前一个主题的字典从App.xaml中取消并且新主题的字典被合并。这些样式使用DynamicResource作为画笔,但这些样式看起来工作正常,因为当我使用Live Visual Tree时,它具有正确名称的右侧画笔,但未设置画笔的颜色。 – StuartMorgan

进入相同/类似的问题并计算出来。对于任何有此问题的人,这里是我所做的:

我必须将样式中的笔刷引用设置为StaticResources,并将笔刷中的颜色引用设置为DynamicResources。现在,当我交换主题(用颜色分开资源字典)时,所有更新都正确。下面是一个例子:

隐式标签样式(注意ForegroundBrush被设置为静态资源):

<Style x:Key="LabelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="Foreground" Value="{StaticResource ForegroundBrush}" /> 
</Style> 

刷子,其上述样式引用:

<SolidColorBrush x:Key="ForegroundBrush" Color="{DynamicResource ForegroundColor}" /> 

这些颜色生活在单独的“主题”资源字典在运行期间交换以更新主题。

轻主题(文本颜色)

<Color x:Key="ForegroundColor">Black</Color> 

黑暗主题(文本颜色)

<Color x:Key="ForegroundColor">White</Color>