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

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


当前回答

使用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#代码的解决方案,然后看看我的这个 解决方案。

其他回答

我知道我可能会去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>

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

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

使用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#代码的解决方案,然后看看我的这个 解决方案。

举个例子,让这个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