StaticResource Lookup不使用合并的字典

时间:2012-02-20 11:38:48

标签: wpf resources static mergeddictionaries

我已经阅读了一段时间了,但我似乎无法找到可以帮助我的答案,所以我希望我能在这里获得更多运气。

在我的项目中,我有一个包含很多控件样式的库。这些样式使用资源作为静态资源。所以“资源树”基本上是这样的:

  • Theme.xaml
    • SizeResources.xaml
    • ColorResources.xaml
    • ControlStyles.xaml
      • Control1.xaml
      • Control2.xaml

Theme.xaml合并SizeResources,ColorResources和ControlStyles。 ControlStyles合并特定控件的所有xamls。

现在在我的应用程序中我想应用该主题,因此OnStartup我将Theme.xaml添加到我的Application.Current.Resources.MergedDictionaries。哪个工作正常,所有键都在那里。当我现在尝试使用控件时,我得到一个异常,例如无法找到大小或颜色资源。具体例子:

我有一个特殊按钮,其背景颜色在ColorResources中定义,我的ButtonStyle使用此资源作为静态资源。当我在我的应用程序项目中使用该Button时,我得到一个异常,即无法找到Background资源。当我在control1.xaml中将静态资源更改为动态资源时,它就可以工作。

任何想法为什么我不能用静态资源做这个?根据我的理解,静态也应该起作用。

2 个答案:

答案 0 :(得分:2)

如果您尝试定义:

<Rectangle Fill="{StaticResource SpecialBackgroundBrush}"/>

代替您的Button,它有效吗?我怀疑它会。假设确实如此,您需要做的是确保Button样式本身具有对画笔的静态访问。因此,在 Button.xaml 中,您需要以下内容:

<ResourceDictionary ...>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ColorResources"/>
    </ResourceDictionary.MergedDictionaries>

    <Style TargetType="Button">
        ...
    </Style>
</ResourceDictionary>

如果这样做没有用,那么查看XAML的示例会很有用。

答案 1 :(得分:0)

即使是动态资源也存在未在相邻合并词典中找到的缺点。但真正的问题在于剥皮。如果您只想更改颜色,而不是控制模板 - 这又取决于那些颜色,那该怎么办?

可以将颜色和模板分成两个XAML文件,但是如果你有几个Color文件(每个皮肤一个),模板文件中应包含哪个“Color”XAML文件?