设计时查找资源字典时出错-项目之间不一致

本文关键字:项目 之间 出错 不一致 字典 查找 资源 | 更新日期: 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应放置在程序集的根级别(而不是文件夹中)。