【问题标题】:Design-time Error finding the Resource Dictionary - Inconsistent between projects查找资源字典的设计时错误 - 项目之间不一致
【发布时间】: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的地方,会抛出后续错误:

    值不能为空。 参数名称:项目

我尝试过的:

阅读大量文章和问答后:

我尝试了以下所有方法均无济于事:

  • 将项目平台目标更改为“任何 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


【解决方案1】:

我已经为这个问题制定了一个解决方案,实施起来并不费力。

首先为资源字典添加一个代码隐藏文件,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 用户控件中,将以下内容添加到构造函数 i UserControl1.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 应放置在程序集的根级别(而不是文件夹中)。

【讨论】:

  • 我目前无法验证此解决方案是否有效 - 我转移了工作,但我试图重现该问题的尝试失败了。不过有机会我会继续努力的。也许其他用户可以提供帮助,@dex3703?
猜你喜欢
  • 2022-08-22
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2014-10-17
相关资源
最近更新 更多