257

我有想要在多个单独的应用程序中使用的资源字典文件(MenuTemplate.xaml、ButtonTemplate.xaml 等)。我可以将它们添加到应用程序的程序集中,但最好将这些资源编译到一个程序集中并让我的应用程序引用它,对吗?

构建资源程序集后,如何在我的应用程序的 App.xaml 中引用它?目前我使用 ResourceDictionary.MergedDictionaries 来合并各个字典文件。如果我将它们放在程序集中,如何在 xaml 中引用它们?

4

7 回答 7

371

查看包 URI 语法。你想要这样的东西:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
于 2008-12-03T20:15:51.097 回答
100

一个例子,只是为了让这成为一个 15 秒的答案 -

假设您在名为“common”的 WPF 库中有“styles.xaml”,并且您想在主应用程序项目中使用它:

  1. 将主项目的引用添加到“普通”项目
  2. 您的 app.xaml 应包含:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

于 2010-03-27T10:01:11.500 回答
39

我正在使用 .NET 4.5,但无法正常工作……我正在使用 WPF 自定义控件库。这最终对我有用......

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

来源: http ://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19

于 2012-04-18T19:09:43.563 回答
21

仅资源 DLL 是您的选择。但除非您想在不重新编译应用程序的情况下修改资源,否则不一定需要。只有一个通用的 ResourceDictionary 文件也是一种选择。这取决于您更改资源的频率等。

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly - 只是没有扩展名的程序集名称

FolderStructureInAssembly - 如果您的资源位于文件夹中,请指定文件夹结构

当您这样做时,最好也了解siteOfOrigin

WPF 支持两种权限:application:/// 和 siteoforigin:///。application:/// 权限标识在编译时已知的应用程序数据文件,包括资源和内容文件。siteoforigin:/// 权限标识原始文件的站点。每个权限的范围如下图所示。

在此处输入图像描述

于 2013-03-30T01:37:00.963 回答
8

对于 UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
于 2017-04-27T10:48:06.840 回答
5

使用 XAML:

如果您知道其他assembly结构并想要c#resources代码,请使用以下代码:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

输出:如果我们想使用ResourceDictionary RD1.xamlProjectWpfControlLibrary1进入StackOverflowApp项目。

项目结构

项目结构

资源字典: 资源字典

代码输出:

输出

PS:所有ResourceDictionary文件都应该有Build Action' Resource'或' Page'。

使用 C#:

如果有人想要纯c# 代码中的解决方案,请查看我的这个解决方案。

于 2016-04-15T12:46:25.867 回答
0

我知道我可能会去 WPF 地狱,但我喜欢保持简单。

在我的名为MyCorp.Wpf.Dll的“外部”WPF 项目中,我有一个名为 assets 的文件夹,其中包含我的资源字典

MyCorp.Wpf.Dll
|- Assets
   |- TextStyles.xaml
   |- Colours.axml

假设我有这个TextStyles.xaml和我需要应用的 UI 字体样式,因为我需要 Windows 10/ 11 样式合规性

    <Style x:Key="Header" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Light"/>
        <Setter Property="FontSize" Value="46" />
    </Style>
    
    <Style x:Key="Subheader" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Light"/>
        <Setter Property="FontSize" Value="32" />
    </Style>
    <Style x:Key="Title" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI SemiLight"/>
        <Setter Property="FontSize" Value="24" />
    </Style>
    <Style x:Key="SubTitle" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Normal"/>
        <Setter Property="FontSize" Value="20" />
    </Style>
    
    <Style x:Key="Base" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Semibold"/>
        <Setter Property="FontSize" Value="15" />
    </Style>
    <Style x:Key="Body" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Normal"/>
        <Setter Property="FontSize" Value="15" />
    </Style>
    <Style x:Key="Caption" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Normal"/>
        <Setter Property="FontSize" Value="12" />
    </Style>   

</ResourceDictionary>

这些风格在我的公司风格指南中,我正在到处重新唱它们

现在在我全新的应用程序中,我可以使用内部 NuGet 包源中的企业样式 DLL,或者我链接它,因为它恰好在我的解决方案中,使用以下资源字典

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/TextStyles.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/Styles.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/Brushes.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/ColorStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

我不知道额外的组件来自哪里,我只知道我需要。然后在我的新应用程序中,我只是像这样链接它:

<Application x:Class="MyNew.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ExternalResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            
            <BooleanToVisibilityConverter x:Key="VisibilityConverter"/>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这样,我在ExternalResources.xaml中拥有所有外部链接,每个人都知道他们来自哪里并且更新它们很容易

然后我可以在我的窗口、页面和控件中使用外部资源定义

<syncfusion:ChromelessWindow x:Class="IDPS.ChromelessWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:IDPS"
        xmlns:r="clr-namespace:IDPS.Wpf.Properties;assembly=IDPS.Wpf"                     
        xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
        syncfusion:SfSkinManager.Theme="{syncfusion:SkinManagerExtension ThemeName=FluentDark}"
        mc:Ignorable="d"
       MinHeight="450" MinWidth="800">
    <Grid>
        <TextBlock Text="Hello world" Style="{StaticResource Title}"/>
    </Grid>
</syncfusion:ChromelessWindow>

我的结果

于 2022-01-27T15:43:34.243 回答