设计时查找资源字典时出错-项目之间不一致
本文关键字:项目 之间 出错 不一致 字典 查找 资源 | 更新日期: 2023-09-27 18:26:07
TLDR
新引用VS2015样式的外部ResourceDictionary
文件的屏幕在运行时正确,但在设计时不正确。什么东西?
在工作中,我们有一个WinForms产品,其中包含许多WinForms屏幕,其中一个开发人员正在积极添加新屏幕,还有一些WPF屏幕,我正在添加新屏幕。注意到现有WPF屏幕中有很多重复的代码/样式,我创建了一个单独的项目来容纳这些代码/样式——供所有现有/未来的WPF屏幕参考。
项目:WpfHelper
- 平台目标:任何CPU
- 目标框架:.NET framework 4.6
WpfHelper.dll
部署到...'Trunk'Project'Externals
...'Trunk'Utilities'WpfHelper'WpfHelper'Resources'GlobalResources.xaml
- 生成操作:页面
- 包含泛型样式的ResourceDictionary
我在六个项目中引用了...'Trunk'Project'Externals'WpfHelper.dll
,并在每个项目的资源文件中添加了以下代码:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WpfHelper;Component/Resources/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
所有屏幕均位于...'Trunk'Project'Plugins
中。
╔══════════╦═════════════════╦═════════════════╦══════════════════╦════════════════════════════════════════════════╗
║ ║ Resource Works? ║ Platform Target ║ Target Framework ║ Reference File Path ║
╠══════════╬═════════════════╬═════════════════╬══════════════════╬════════════════════════════════════════════════╣
║ Project1 ║ Succeeded ║ Any CPU ║ .NET 4.6 ║ ...'Project1'Project1'Resources'Resources.xaml ║
║ Project2 ║ Succeeded ║ x86 ║ .NET 4.6 ║ ...'Project2'Project2'Resources'Resources.xaml ║
║ Project3 ║ Succeeded ║ Any CPU ║ .NET 4.6 ║ ...'Project3'Project3'Resources'Resources.xaml ║
║ Project4 ║ Failed ║ x86 ║ .NET 4.6 ║ ...'Project4'Project4'Resources'Resources.xaml ║
║ Project5 ║ Failed ║ x86 ║ .NET 4.6 ║ ...'Project5'Project5'Resources'Resources.xaml ║
║ Project6 ║ Failed ║ Any CPU ║ .NET 4.6 ║ ...'Project6'Project6'Resources'Resources.xaml ║
╚══════════╩═════════════════╩═════════════════╩══════════════════╩════════════════════════════════════════════════╝
最近的变化
就在最近,我将Visual Studios 2013升级到了2015。大约在同一时间,另一个屏幕开发人员将所有现有屏幕项目的目标框架从.NETFramework3.5/4.0升级到.NETFramework4.6。
成功的项目
- 在最近的更改之前,我引用了
WpfHelper.dll
- 在设计时和运行时正确应用样式
失败的项目
- 我在最近的更改之后引用了
WpfHelper.dll
- 仅在运行时正确应用样式
- 在设计时,会引发错误:
查找资源字典时出错"pack://application,,/WpfHelper;component/Resources/GlobalResources.xaml".
- 在使用本地
Resources.xaml
的情况下,会引发以下错误:值不能为null。参数名称:项目
我尝试过的:
在阅读了大量的文章和问答之后;A's:
- 设计时WPF XAML资源词典
- 如何在WPF中的设计时加载ResourceDictionary
- 在单独的程序集中查找资源字典时出错
- 在.NET 4.0中加载合并资源字典时出现问题
- 在Windows Presentation Foundation中打包URI
- VS2013:查找资源字典时出错
- 查找资源字典时出错
- 在另一个程序集中查找合并的资源字典时出错
- 引用包含合并词典的资源词典时出现问题
- WPF VS2013:查找资源字典时出错
- 应用程序运行正常,但在设计时出现"错误":"命名空间中不存在"answers"查找资源字典时出错"
- 作为链接文件的资源字典
- Visual Studio 2015 XAML资源字典错误
我尝试了以下所有操作,但都没有成功:
- 将项目平台目标更改为"任意CPU"
- 将项目目标框架从.NET framework 4.6更改为.NET framework 4.6
- 确保所有Resource.xaml文件都具有相同的Build Action(Page)等
检查了每个项目的
AssemblyInfo.cs
文件。失败的项目包括(我删除了)以下内容:[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
手动清除AppsData中的临时文件夹,已清理&重建项目。
- 重新打开的项目
- 重新启动
- 右键单击从工作项目中复制
WpfHelper.dll
引用,并粘贴到失败项目的引用中 - 将
WpfHelper.Resources.GlobalResources.xaml
作为链接文件添加到失败的项目中 - 每一个同事都在唠叨
- 添加了
GlobalResources.xaml
中使用的子字典的完整包URI - 杀死了设计师并重建了项目
我没有想法,沉浸在研究中。我已经将其中一个工作解决方案模板化,并将其用于创建新屏幕——即创建在设计时成功显示的新屏幕。这是关于这些预先存在的屏幕。如何让失败的项目在设计时正确显示样式资源?
我已经为这个问题找到了一个几乎不需要实现的解决方案。
首先为资源字典添加一个代码隐藏文件GlobalResources.xaml.cs:
namespace YourNamespaceHere
{
partial class GlobalResources : ResourceDictionary
{
public GlobalResources()
{
InitializeComponent();
}
}
}
然后将x:Class属性设置为GlobalResources.xaml:中的ResourceDictionary标记
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YourNamespaceHere.GlobalResources">
您现在可以创建这样的资源字典实例:
new YourNamespaceHere.GlobalResources()
在使用资源字典的WPF用户控件中,将以下内容添加到构造函数iUserControl1.xaml.cs:
public UserControl1()
{
if (DesignerProperties.GetIsInDesignMode(this))
this.Resources.MergedDictionaries.Add(new YourNamespaceHere.GlobalResources());
InitializeComponent();
}
现在,使用UserControl1的控件的WinForms设计器将不再抱怨找不到包含资源字典的dll。已使用的资源也将显示在设计器中。
为了确保WPF设计器将显示UserControl1中使用的资源字典中的内容,您仍然需要在UserControl1.xaml:中使用以下内容
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MyDll;component/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
MyDll是包含资源字典的程序集的名称。在本例中,GlobalResources.xaml和GlobalResources.xaml.cs应放置在程序集的根级别(而不是文件夹中)。