我有资源字典文件(MenuTemplate。xaml, ButtonTemplate。xaml等),我想在多个单独的应用程序中使用。我可以将它们添加到应用程序的程序集中,但如果我在一个程序集中编译这些资源并让我的应用程序引用它会更好,对吗?
资源程序集构建后,如何在应用程序的App.xaml中引用它?目前我使用ResourceDictionary。合并各个字典文件。如果我在一个程序集中有它们,我如何在xaml中引用它们?
我有资源字典文件(MenuTemplate。xaml, ButtonTemplate。xaml等),我想在多个单独的应用程序中使用。我可以将它们添加到应用程序的程序集中,但如果我在一个程序集中编译这些资源并让我的应用程序引用它会更好,对吗?
资源程序集构建后,如何在应用程序的App.xaml中引用它?目前我使用ResourceDictionary。合并各个字典文件。如果我在一个程序集中有它们,我如何在xaml中引用它们?
检查包的URI语法。你想要这样的东西:
<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
举个例子,让这个15秒的答案
说你有“风格”。在一个名为common的WPF库中,你想在你的主应用程序项目中使用它:
添加一个从主项目到“公共”项目的引用 你的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 - 8 d87 - 4656 - 91 - a3 - 275413 - d3cc19
只有资源的DLL是您的一个选项。但这并不是必需的,除非您希望在不重新编译应用程序的情况下修改资源。只有一个公共ResourceDictionary文件也是一种选择。这取决于你更换资源的频率等等。
<ResourceDictionary Source="pack://application:,,,/
<MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>
MyAssembly -只有程序集名称,没有扩展名
FolderStructureInAssembly -如果资源在一个文件夹中,请指定文件夹结构
当你这样做的时候,最好了解siteOfOrigin以及。
WPF支持两个权限:application:///和siteoforigin:///。 application:///权限标识应用程序数据文件 在编译时已知,包括资源文件和内容文件。的 siteoforigin:/// authority标识原始文件的站点。范围 各机构的情况如下图所示。
使用XAML:
如果你知道其他程序集结构,并且想要c#代码中的资源,那么使用下面的代码:
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。项目WpfControlLibrary1的xaml到StackOverflowApp项目。
项目结构:
资源字典:
代码的输出:
PS:所有ResourceDictionary文件都应该有“资源”或“页面”的构建动作。
使用c#:
如果有人想要纯c#代码的解决方案,然后看看我的这个 解决方案。
UWP:
<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
我知道我可能会去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>