ResourceDictionary.MergedDictionaries导致奇怪的错误

时间:2017-05-10 08:29:13

标签: c# wpf visual-studio-2015 compiler-errors

在我的WPF应用程序中,我包含来自另一个项目的ResourceDictionary。

<Application x:Class="namespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- This Line causes an Error -->
                <ResourceDictionary Source="pack://application:,,,/Commons;Component/Generic.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
  

元数据覆盖和基本元数据必须属于同一类型或派生类型。

解决方案构建成功并运行。

重新启动Visual Studio无法修复它。

剪切并粘贴<ResourceDictionary Source="..." />行导致另一个错误,如评论中所解释的hereValue Cannot be Null. Parameter Name: item。然后重新启动Visual Studio将返回旧错误。

可悲的是,我还没有发现如何重现这个错误,我只能告诉你更多有关环境的信息:

  • Visual Studio 2015 Professional,版本14.0.25431.01更新3

尽管我怀疑,这些与我的问题有关,这里是我安装的插件:

  • Resharper Ultimate 2017.1.1
  • GitExtensions版本2.49.03

1 个答案:

答案 0 :(得分:0)

Sinatr 的评论暗示我要阅读更多关于主题的内容。

ThemeInfo

在自定义控件库中,theres会在ThemeInfoAttribute

内自动创建AssemblyInfo.cs
[assembly:ThemeInfo(
 ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
                          //(used if a resource is not found in the page, 
                          // or application resource dictionaries)
 ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
                                   //(used if a resource is not found in the page, 
                                   // app, or any theme specific resource dictionaries)
)]

参数

正如在自动生成的注释中所述,第一个参数用于确定是否存在或在何处查找主题特定的资源词典。 第二个参数定义了存在或找到通用ResourceDictionaryGeneric.xaml)的位置。

ResourceDictionaryLocation - 枚举

ResourceDictionaryLocation - 枚举本身用于指定这些词典的位置。

ResourceDictionaryLocation.None

  

不存在主题词典。

ResourceDictionaryLocation.SourceAssembly

  

主题词典存在于程序集中,用于定义主题类型。   期望ResourceDictionary位于/Themes - 文件夹中。稍后解释。

ResourceDictionaryLocation.ExternalAssembly

  

主题词典存在于定义主题类型的组件外部的程序集中。

我不打算解释这是如何运作的。

为什么/Themes - 文件夹

可悲的是,我找不到太多关于此的内容。如果有人有更多信息,请分享。

你有没有想过,无形控制的风格是如何应用的?

如果有人创建了一个无形控件,他按如下方式执行:

public class MyControl : ControlTemplate
{
    static MyControl() 
    {
        // This tells WPF to search for a Style for this type
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl)), 
            new FrameworkPropertyMetadata(typeof(MyControl)));
    }
}

简而言之,WPF中的Ressources位于,通过搜索 Logical-Tree ,然后在Application的资源中,最后在内部。他们打电话给 System-Area (这是我的德语翻译,如果你知道更好的话请告诉他们。)

因此,ThemeInfo取决于MyControlResourceDictionary可能在/Themes - 文件夹中的/Themes/Generic.xaml内设置了样式。 System-Area 告诉WPF将Ressources添加到 /Themes/Generic.xaml ,最终会自动解析相应的样式。

<Style TargetType="{x:Type MyControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type MyControl}"> .. </ControlTemplate/> </Setter.Value> </Setter> </Style> 内的某处:

ThemeInfoAttribute
  

这就是上述Generic.xaml要求/Themes位于System-Area - 文件夹中的原因。 - 不知何故,即使在我的情况下, {{1}} -Functionality甚至不用于此通用文件,这也会导致这些错误。但我无法找出原因。

来源: