在C#类库项目中使用(合并)资源字典

时间:2016-01-18 07:16:35

标签: c# wpf xaml resourcedictionary

如何在C#类库项目中使用(合并的)WPF资源字典?

这是我做的:

在我的C#类库项目中,我有一个 Dictionary1.xaml 文件:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                >
    <Style x:Key="PluginFrameBorderStyle">
    ...
    </Style>
</ResourceDictionary>

然后,我有一个UserControl文件 UserControl1.xaml ,我尝试使用这样的字典:

<UserControl x:Class="EditorPackageA.BackboneMemberB1Editor.BackboneMemberB1Editor"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         xmlns:local="clr-namespace:EditorPackageA.EditorBase"
         xmlns:prism="http://www.codeplex.com/prism" d:DesignWidth="690.4" d:DesignHeight="460.12">
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Dictionary1.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
...
</UserControl>

项目编译但在运行时我收到错误:

enter image description here

除了详细信息:

enter image description here

WPF项目中应用相同的方法,而不是类库项目

这里可能有什么解决方案?

重要附录:

在设计时我看到通过ResourceDictionary嵌入的使用样式的效果,因此样式和字典的URI必须正确!?

3 个答案:

答案 0 :(得分:1)

尝试使用所谓的pack URI。我认为您必须明确指定资源字典的位置。

<ResourceDictionary Source="pack://application:,,,/TheNameOfClassLibrary;component/Dictionary1.xaml"/>

对于WPF项目,您的方法可行,因为WPF引擎默认查找正在执行的程序集中的资源(在exe中)。

答案 1 :(得分:0)

您可能需要在应用程序资源中合并库的资源字典。您需要编辑App.xaml文件并添加如下内容:

$query = $repository->createQueryBuilder('u')
                    ->addSelect('g')
                    ->join('PNCLogBundle:LoginHistory', 'log', 'WITH log.User = u.id')
                    ->innerJoin('u.groups', 'g')
                    ->andwhere('g.id = u.group')
                    ->where('u.roles LIKE :roles')
                    ->setParameter('roles', '%"ROLE_STAFF"%')
                    ->getQuery();

答案 2 :(得分:0)

您应该使用程序集和组件名称将ResourceDictionary xml文件引用/链接到Source属性。
使用相对路径如下:

<ResourceDictionary Source="../Dictionary1.xaml" /> 

如果不起作用,请尝试PACK URL

<ResourceDictionary Source="pack://application:,,,/Your.Base.AssemblyName;component/DictionaryFolder/Dictionary1.xaml" />

希望它可以帮到你