我正在寻找一种在项目之间共享ResourceDictionary
的方法。
向共享项目添加新项目不提供资源字典。它可以在其他(主)项目中创建并拖动。但后来我无法将其构建选项更改为 Page :
想法是加载像这样的资源字典
var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative);
目前显然已失败
PresentationFramework.dll中出现“System.IO.IOException”类型的异常,但未在用户代码中处理
其他信息:找不到资源'dictionary2.xaml'。
有什么想法吗?
答案 0 :(得分:3)
可以手动编辑共享项目以设置资源字典的构建操作。
共享项目包含Project.shproj
和Project.projitems
个文件,打开第二个并在那里找到字典:
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" />
</ItemGroup>
之后添加
<ItemGroup>
<Page Include="$(MSBuildThisFileDirectory)Dictionary.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
对于包含字典的WPF项目,它是普通csproj
的复制/粘贴内容。
似乎可行,但在将项目加载到Visual Studio时,此构建操作不可见。将文件添加到共享项目不会影响此手动更改。
现在我可以拥有包含资源字典的共享项目,yay!
资源字典可以合并到应用程序字典中,就好像它位于项目的根目录中(在xaml设计器中用作静态/动态资源):
<Application.Resources>
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries>
<!-- doesn't really exists in project -->
<ResourceDictionary Source="Dictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
和/或手动加载,例如使用此pack Uri:
var dictionary = new ResourceDictionary()
{
Source = new Uri("pack://application:,,,/FlexProperty.xaml"),
};
答案 1 :(得分:3)
我遇到了同样的问题。有一个解决方案可以将Xaml包含在共享项目中,而这些项目并不需要直接编辑.projitems文件。
您只需将Xamarin添加到Visual Studio安装中即可。 (我是在VS社区2015中做到的。)
您现在可以通过常用的Visual Studio对话框添加xaml类型:
共享项目中的Xaml现在可以按预期编译和运行。
(可能这是支持Xamarin Forms,但它适用于任何xaml文档。)
答案 2 :(得分: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);