单独库中的资源词典

本文关键字:资源 单独库 | 更新日期: 2023-09-27 18:01:27

我已经在一个单独的库中定义了我的resourceDictionary,如下所示

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cultures="clr-namespace:My_Localization.Cultures"
    xmlns:properties="clr-namespace:My_Localization.Properties">
    <ObjectDataProvider x:Key="Resources" ObjectType="{x:Type cultures:CultureResources}" MethodName="GetResourceInstance"/>
    <ObjectDataProvider x:Key="CultureResourcesDS" ObjectType="{x:Type cultures:CultureResources}"/>
</ResourceDictionary> 

我从另一个库中使用了这个库,如下所示(仅限xaml的头文件)

<msRibbon:RibbonTab x:Class="Ribbon.Planner.PlannerRibbon"
    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" 
    xmlns:msRibbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
    mc:Ignorable="d" 
    d:DesignHeight="100" d:DesignWidth="500" Header="{Binding Path=Ribbon_About, Source={StaticResource Resources}}" 
    >
    <Grid>
     ...
     ...
     ...
    </Grid>

我已经添加了My_Localization库的引用,我只更改标题。所有的工作都很好,但唯一的问题是,在设计时,我有"Header="{Binding Path=Ribbon_About, Source={StaticResource Resources}}"下划线。当我将鼠标悬停时,提示"资源"资源"无法解析"

为什么有一个错误像提示在我的xaml?那为什么一切都很好呢?

My Solution结构

  1. MainExe -包含app.xaml。我在这里合并了资源字典。在xaml中没有问题,因为合并字典存在于app.xaml
  2. My_Localization -包含资源字典的库(上面的代码)
  3. Lib1 -参考My_Localization和有问题的xaml解释
  4. Lib2 -参考My_Localization和有问题的xaml解释
  5. Lib3 -参考My_Localization和有问题的xaml解释

单独库中的资源词典

您需要在app.xaml文件中或本地提供对ResourceDictionary的引用。app.xaml中的资源对应用程序的所有xaml文件全局可用。

对于库项目中的Xaml文件,设计器的工作方式略有不同。

在运行时,启动项目中的app.xaml将用于所有程序集。在设计时,它将是本地程序集的app.xaml。这意味着,您可以将app.xaml文件添加到库中,仅在从特定库呈现xaml文件时由Visual Studio设计器使用(将文件的构建动作设置为Page)。

引用ResourceDictionary:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Application.Resources>
        <ResourceDictionary>
            <!-- Other global resources -->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/ASSEMBLYNAME;component/FOLDERPATH/RDNAME.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

其中ASSEMBLYNAME是ResourceDictionary所在程序集的名称(检查项目属性)。

的例子:

程序集名称为"MyAssembly"的项目,ResourceDictionary位于文件夹路径"Resources/rd/mld .xaml"

Source="pack://application:,,,/MyAssembly;component/Resources/RDs/MyRd.xaml"

App.xaml中,您必须将MergedDictionary添加到引用其他字典的资源中。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RibbonControlsLibrary;component/Your/Dictionary/Path.xaml" />
            ...
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

您可以在每个示例中包含ResourceDictionary

<msRibbon:RibbonTab x:Class="Ribbon.Planner.PlannerRibbon"
    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" 
    xmlns:msRibbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
    mc:Ignorable="d" 
    d:DesignHeight="100" d:DesignWidth="500" Header="{Binding Path=Ribbon_About, Source={StaticResource Resources}}">
    <msRibbon:RibbonTab.Resources>
        <ResourceDictionary Source="pack://application:,,,/<ASSEMBLY_NAME>;component/<RESOURCES_FILE>.xaml"/>
    </msRibbon:RibbonTab.Resources>
    <Grid>
     ...
     ...
     ...
    </Grid>