5

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

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

在此处输入图像描述

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

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

这显然是目前失败的

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

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

有任何想法吗?

4

3 回答 3

4

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

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

<ItemGroup>
  <None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" />
</ItemGroup>

之后添加

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

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>

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

var dictionary = new ResourceDictionary()
{
     Source = new Uri("pack://application:,,,/FlexProperty.xaml"),
};
于 2017-01-03T09:50:55.047 回答
3

我遇到了同样的问题。有一种将 Xaml 包含在共享项目中的解决方案,不需要直接编辑 .projitems 文件。

您只需将 Xamarin 添加到您的 Visual Studio 安装中。(我用 VS Community 2015 做到了。)

您现在可以通过通常的 Visual Studio 对话框添加 xaml 类型: 添加资源字典

并且可以使用正确的构建操作: 构建动作

共享项目中的 Xaml 现在可以按预期编译和运行。

(大概这是为了支持Xamarin Forms,但它适用于任何 xaml 文档。)

于 2017-02-22T14:51:58.280 回答
0

这个问题是您正在放置应用程序名称。您需要项目名称。以下是如何在 XAML 和代码中执行此操作

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/SharedProject1;Component/Dictionary2.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

或者

var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("/SharedProject1;component/Dictionary2.xaml", UriKind.Relative);
于 2016-12-14T13:51:32.700 回答