ResourceDictionary在单独的程序集中

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

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

150562 次浏览

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

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

举个例子,让这个15秒的答案

假设你有“样式”;在一个名为“common”的WPF库中;你想从你的主应用程序项目中使用它:

  1. 从主项目中添加一个引用到“common”;项目
  2. 你的app.xaml应该包含:

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

我正在使用。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

只有资源的DLL是您的一个选项。但这并不是必需的,除非您希望在不重新编译应用程序的情况下修改资源。只有一个公共ResourceDictionary文件也是一种选择。这取决于你更换资源的频率等等。

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

MyAssembly -只有程序集名,没有扩展名

FolderStructureInAssembly -如果你的资源在一个文件夹中,指定文件夹结构

当你这样做的时候,最好也了解siteOfOrigin

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

.

.

enter image description here

使用XAML < em >: < / em >

如果你知道另一个assembly结构,并且想要在c# < em > < / em >代码中使用resources,那么使用下面的代码:

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

如果我们想要使用项目WpfControlLibrary1ResourceDictionary RD1.xamlStackOverflowApp项目。

项目结构:

Structure of Projects .

< >强资源字典: 资源字典 < / p >

代码的输出:

Output

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

使用c# < em >: < / em >

如果有人想在纯粹的< em > < / em > c#代码解决方案,然后看到我的这个 解决方案。< / > < / p >

UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

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

在我的“外部”;WPF项目命名为MyCorp.Wpf.Dll,其中我有一个文件夹称为资产与我的资源字典

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>

My result