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

OhB*_*ise 9 c# wpf resourcedictionary visual-studio-2015

TLDR;

屏幕ResourceDictionary在运行时正确地引用VS2015样式的外部文件,但不是在设计时.是什么赋予了?


在工作中,我们有一个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>
Run Code Online (Sandbox Code Playgroud)

所有屏幕都位于...\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 ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

近期变动

就在最近,我将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,抛出后续错误:

    值不能为空.参数名称:item

我尝试过的:

阅读了大量文章和问答后:

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

  • 将项目平台目标更改为"任何CPU"
  • 将项目目标框架从/向.NET Framework 4.6更改
  • 确保所有Resource.xaml文件具有相同的Build Action(Page)等.
  • 检查每个项目的AssemblyInfo.cs文件.失败的项目包括(并删除)以下内容:

    [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
    
    Run Code Online (Sandbox Code Playgroud)
  • 手动清除AppsData,Cleaned和Rebuilt项目中的临时文件夹.

  • 重新开放项目.
  • 重新启动.
  • 右键单击WpfHelper.dll工作项目中复制的引用,并粘贴到失败项目的引用中.
  • 将已添加的WpfHelper.Resources.GlobalResources.xaml链接文件添加到失败的项目中.
  • 每个同事都耿耿于怀.
  • 添加了用于的子词典的完整包URI GlobalResources.xaml.
  • 杀死了设计师并重建了项目.

我没有想法,迷失在研究中.我模板的工作解决方案之一,使用了用于创建新的屏幕-这创造了新的屏幕,其成功地显示在设计时.这是关于这些预先存在的屏幕的东西.如何让失败的项目在设计时正确显示样式化资源?

Chr*_*oll 3

我已经找到了解决这个问题的方法,只需付出很少的努力即可实现。

首先为资源字典添加一个代码隐藏文件 GlobalResources.xaml.cs:

namespace YourNamespaceHere
{
    partial class GlobalResources : ResourceDictionary
    {
        public GlobalResources()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将 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">
Run Code Online (Sandbox Code Playgroud)

您现在可以像这样创建资源字典的实例:

new YourNamespaceHere.GlobalResources()
Run Code Online (Sandbox Code Playgroud)

在使用资源字典的 WPF 用户控件中,将以下内容添加到 UserControl1.xaml.cs 的构造函数中:

public UserControl1()
{
    if (DesignerProperties.GetIsInDesignMode(this))
        this.Resources.MergedDictionaries.Add(new YourNamespaceHere.GlobalResources());

    InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)

现在,使用 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>
Run Code Online (Sandbox Code Playgroud)

MyDll 是包含资源字典的程序集的名称。在此示例中,GlobalResources.xaml 和 GlobalResources.xaml.cs 应放置在程序集的根级别(而不是文件夹中)。