带有资源字典的共享项目(xaml)

Sin*_*atr 5 c# wpf xaml resourcedictionary shared-project

我正在寻找一种ResourceDictionary在项目之间共享的方法。

将新项目添加到共享项目不提供资源字典。它可以在其他(主)项目中创建并拖动。但是我无法将其构建选项更改为Page

在此输入图像描述

这个想法是像这样加载资源字典

var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)

目前这显然失败了

“System.IO.IOException”类型的异常出现在PresentationFramework.dll中,但未在用户代码中处理

附加信息:无法找到资源“dictionary2.xaml”。

有任何想法吗?

Sin*_*atr 4

可以手动编辑共享项目来设置资源字典的构建操作。

共享项目由Project.shprojProject.projitems文件组成,打开第二个文件并在其中找到字典:

<ItemGroup>
  <None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

之后添加

<ItemGroup>
  <Page Include="$(MSBuildThisFileDirectory)Dictionary.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
  </Page>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

csproj对于包含字典的 WPF 项目来说,这是正常的复制/粘贴操作。

似乎有效,尽管当项目加载到 Visual Studio 中时此构建操作不可见。将文件添加到共享项目不会影响此手动更改。

现在我可以共享包含资源字典的项目了,耶!

资源字典可以合并到应用程序字典中,就像它位于项目的根目录中一样(在 xaml 设计器中用作静态/动态资源):

<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <!-- doesn't really exists in project -->
            <ResourceDictionary Source="Dictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

和/或手动加载,例如使用此包 Uri

var dictionary = new ResourceDictionary()
{
     Source = new Uri("pack://application:,,,/FlexProperty.xaml"),
};
Run Code Online (Sandbox Code Playgroud)