4

我有一个名为 MyClassLibrary 的 Silverlight 类库。

在其中,我有一个名为 MyControl 的用户控件。

在控件中,我定义了用户资源:

<UserControl.Resources>
    <Style x:Key="ComboBoxStyle" TargetType="ComboBox">
       (lots of xaml)
    </Style>
</UserControl.Resources>

该控件使用如下样式:

<ComboBox Style="{ StaticResource ComboBoxStyle }"></ComboBox>

这一切都很完美,ComboBox 提供了正确的样式,所以我知道样式写得正确。

我真正想要的是将样式放在资源字典中,以便该程序集中的多个不同控件可以使用它。所以我在同一个程序集中创建了一个资源字典。我称之为 ResourceDictionary.xaml。

我将样式定义从我的用户控件移动到资源字典。

那么资源字典看起来像这样:

<ResourceDictionary
xmlns="etc" >
    <Style x:Key="ComboBoxStyle" TargetType="ComboBox">
       (lots of xaml)
    </Style>
</ResourceDictionary>

控件的用户资源现在如下所示:

<UserControl.Resources>
    <ResourceDictionary 
     Source="/MyClassLibrary;component/ResourceDictionary.xaml" x:Name="resDict"/>
</UserControl.Resources>

并且控件仍然以与以前完全相同的方式使用样式。

现在我知道它正在查找 ResourceDictionary.xaml 文件,因为我尝试将“Source”属性更改为 NonExistentFile.xaml,但它抱怨找不到该文件。它不会对 ResourceDictionary.xaml 提出投诉,所以我认为它正在找到它。

但是,当我运行该应用程序时,我收到“找不到具有名称/键组合框样式的资源”的错误。

我究竟做错了什么?这看起来很简单,但它不起作用。

提前感谢您能给我的任何帮助。

4

2 回答 2

2

不确定这是否有帮助,但我将我的 ResourceDictionaries 包含在 App.xaml 中:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Sausage/Bangers.xaml"/>
            <ResourceDictionary>
                .. other stuff, e.g.
                <helpers:NotOperatorValueConverter x:Key="NotOperatorValueConverter" />
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

即使您不喜欢这种方法,您也可以看到我的 Source= 与您的不同。

于 2010-01-30T08:51:16.923 回答
0

谢谢你们俩,你们的回答确实让我解决了这个问题。

我真正拥有的是这样的:

<UserControl.Resources>
  <Style ...> stuff </Style>
</UserControl.Resources>

然后我添加了我的,所以它看起来像这样

<UserControl.Resources>
  <Style ...> stuff </Style>
  <ResourceDictionary Source="..." />
</UserControl.Resources>

现在这个编译得非常漂亮,但就是不会运行。我不明白我需要使用 MergedDictionaries。所以后来我得到了这个概念并重新组织了这个部分,现在一切都很好。

非常感谢!

于 2010-02-01T20:06:56.173 回答