2

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

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

  • 主题.xaml
    • 大小资源.xaml
    • 颜色资源.xaml
    • ControlStyles.xaml
      • 控件1.xaml
      • Control2.xaml

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

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

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

任何想法为什么我不能用静态资源做到这一点?据我了解,静态也应该起作用。

4

2 回答 2

2

如果您尝试定义:

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

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

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

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

如果这没有帮助,那么查看您的 XAML 示例将会很有用。

于 2012-02-20T14:19:43.053 回答
0

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

可以将颜色和模板分成两个 XAML 文件,但是如果您有多个这些颜色文件(每个皮肤一个),模板文件应该包括哪个“颜色”XAML 文件?

于 2012-07-12T13:41:56.537 回答