【发布时间】:2015-12-08 21:49:14
【问题描述】:
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- 构建操作:页面
- 包含通用样式的资源字典
我在六个项目中引用了...\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。大约在同一时间,另一位屏幕开发人员将所有现有屏幕项目的目标框架从 .NET Framework 3.5/4.0 升级到 .NET Framework 4.6。
成功的项目
- 我在最近的更改之前引用了
WpfHelper.dll。 - 在设计时和运行时正确应用样式。
失败的项目
- 我在最近的更改之后引用了
WpfHelper.dll。 - 样式仅在运行时正确应用。
- 在设计时,抛出错误:
查找资源字典“pack://application,,,/WpfHelper;component/Resources/GlobalResources.xaml”时出错。
- 在使用本地
Resources.xaml的地方,会抛出后续错误:值不能为空。 参数名称:项目
我尝试过的:
阅读大量文章和问答后:
- Design Time WPF XAML Resource Dictionaries
- How to load a ResourceDictionary at Design Time in WPF
- Error finding resource dictionary in separate assembly
- Problems loading merged resource dictionaries in .NET 4.0
- Pack URIs in Windows Presentation Foundation
- VS2013: An error occurred while finding the resource dictionary
- An error occurred while finding the resource dictionary
- Error finding merged resource dictionary in another assembly
- Trouble referencing a Resource Dictionary that contains a Merged Dictionary
- WPF VS2013: An error occurred while finding the resource dictionary
- App runs normally but has “errors” during design time: “does not exist in namespace” and “an error occured when finding the resource dictionary”
- Resource Dictionary as Linked File
- Visual Studio 2015 XAML Resource Dictionary Error
我尝试了以下所有方法均无济于事:
- 将项目平台目标更改为“任何 CPU”
- 从/到 .NET Framework 4.6 更改项目目标框架
- 确保所有 Resource.xaml 文件具有相同的构建操作(页面)等。
-
检查了每个项目的
AssemblyInfo.cs文件。失败的项目包括(我删除了)以下内容:[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 手动清除 AppsData、Cleaned & Rebuilt 项目中的临时文件夹。
- 重新打开的项目。
- 已重新启动。
- 右键单击从工作项目中复制
WpfHelper.dll引用并粘贴到失败项目的引用中。 - 将
WpfHelper.Resources.GlobalResources.xaml作为链接文件添加到失败的项目中。 - 唠叨每一位同事。
- 为
GlobalResources.xaml中使用的子词典添加了完整的包 URI。 - Killed the designer 并重建了项目。
我没有想法,迷失在研究中。我有templated 一个有效的解决方案,并将其用于创建新屏幕——创建在设计时成功显示的新屏幕。这与这些预先存在的屏幕有关。如何让失败的项目在设计时正确显示样式资源?
【问题讨论】:
-
你能解决这个问题吗?
-
@Olga 遗憾的是,这从未解决。它使得修改有罪屏幕的 GUI 变得更加耗时。
-
希望我能帮上忙。对于任何复杂的项目来说,这都是一个一贯的问题。
-
@Olga 提供了一个新的解决方案。你能验证它是否适合你吗?
-
@OhBeWise 不幸的是我无法测试这个答案。我目前正在做另一个项目。如果我回到这个问题,我一定会测试这个答案。
标签: c# wpf visual-studio-2015 resourcedictionary