在单独的项目中引用资源字典

时间:2012-06-20 08:56:27

标签: silverlight silverlight-5.0 resourcedictionary

我最近将我的silverlight应用程序拆分为几个较小的项目。

我已将包含我的样式的所有资源字典移动到一个单独的项目(“Application.Themes”)中,然后我从我的主项目中的App.xaml文件中引用它们。

这适用于主项目,但引用这些资源字典中的样式的所有其他项目在设计器中抛出“对象引用未设置为对象的实例”异常,尽管它们编译运行没有任何问题,并且正确的风格。

我已经将App.xaml文件添加到每个引用与我的主App.xaml文件相同的字典的单个项目中,这没有任何区别。

是否有正确的方法从另一个允许设计师使用的项目中引用资源字典?

修改

以下是一些更多信息和一些代码片段,用于演示我遇到的问题

我在这个项目中有一个名为“Themes”的样式项目我有几个字典定义了项目的所有样式。

在我的主App.xaml中,我有以下

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Themes;component/Styles/CoreStyles.xaml"/>
            <ResourceDictionary Source="/Themes;component/Styles/Styles.xaml" />
        </ResourceDictionary.MergedDictionaries>

如果我在主项目中引用样式,它们可以正常工作。但是,即使这些项目引用了Themes项目,它们也不适用于任何其他项目。

我尝试在每个UserControl的开头添加以下内容,以便在设计时解析样式,但它仍然无法解析项目中的样式。

<UserControl>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Themes;component/Styles/CoreStyles.xaml"/>
                <ResourceDictionary Source="/Themes;component/Styles/Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>

    <!-- Additional Control Specific resources -->
    </ResourceDictionary>
</UserControl.Resources>


<!-- The following resources are defined in Styles.XAML and don't resolve at design time  and throw errors -->
<TextBlock Text="Header Test"
           FontFamily="{StaticResource HeaderFontFamily}"
           Foreground="{StaticResource StrongBrush}">

</UserControl>

我的styles.xaml看起来与此类似。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:behaviors="clr-namespace:Minerva.Presentation.Behavior;assembly=Minerva.Presentation"
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">

<SolidColorBrush x:Key="StrongBrush" Color="{Binding Source={StaticResource MetroColors}, Path=Palette.StrongColor}" />
<FontFamily x:Key="HeaderFontFamily">Segoe UI Light, Lucida Sans Unicode, Verdana</FontFamily>

</ResourceDictionary>

2 个答案:

答案 0 :(得分:2)

为styles / themes项目创建一个程序集,以便其他项目可以引用它。 为了使用MergedDictionaries

在app.xaml / page.xaml中将这些样式合并到应用程序中
<Application.Resources>
 <ResourceDictionary>  
   <ResourceDictionary.MergedDictionaries>
         <ResourceDictionary Source="/Assembly;component/Stylesorthemes.xaml"/>             
     </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources> 

希望这很有用。

答案 1 :(得分:0)

我创建了一个汇编测试,其中包含资源字典Theme.xaml

Theme.xaml代码

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Thickness x:Key="GeneralThickness">10</Thickness>
</ResourceDictionary>

我创建了单独的silverlight项目testreturns

case1.In App.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         x:Class="testreturns.App"
         >
<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/test;component/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
</Application>

case2.Usercontrol level

<UserControl.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/test;component/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources> 

使用它来设置按钮的borderthickness

<Button Height="50" Width="150" BorderThickness="{StaticResource GeneralThickness}"/>

在这两种情况下,它都适合我。 这是你想要的吗? 在创建程序集时是否将theme.xaml文件属性BuildAction设置为Resource?