ResourceDictionaryLocation

ResourceDictionaryLocation

在我的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="..." />行会导致另一个错误,如注释中here所述:Value Cannot be Null. Parameter Name: item。重新启动Visual Studio将带回旧错误。

可悲的是,我还没有找到如何重现此错误的方法,我只能告诉您有关环境的更多信息:
  • Visual Studio 2015专业版,版本14.0.25431.01更新3

  • 尽管我对此表示怀疑,但这些都是与我的问题有关的,这里是我安装的插件:
  • Resharper Ultimate 2017.1.1版
  • GitExtensions版本2.49.03
  • 最佳答案

    Sinatr 的评论提示我阅读有关主题的更多信息。ThemeInfo在自定义控件库内部,在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)
    )]
    
    参量
    正如它在自动生成的注释中指出的那样,第一个参数用于确定是否存在主题或特定于主题的资源字典。
    第二个参数定义了是否存在通用ResourceDictionary(Generic.xaml)或在哪里找到。ResourceDictionaryLocation-枚举ResourceDictionaryLocation -Enumeration本身用于指定这些词典的位置。ResourceDictionaryLocation.None ResourceDictionaryLocation.SourceAssembly 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)));
        }
    }
    
    简而言之,通过搜索Logical-Tree,然后在Application的Resources中,最后在sth中,可以找到WPF中的资源。他们叫System-Area(如果您知道更好的话,这是我的德语翻译)。
    因此,取决于ThemeInfoMyControl可能在ResourceDictionary -Folder内部的/Themes中具有其样式。 /Themes/Generic.xaml。还有,即告诉WPF将资源添加到System-Area中,最终导致自动解析适当的样式。
    /Themes/Generic.xaml内的某处:
    <Style TargetType="{x:Type MyControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type MyControl}">
                ..
                </ControlTemplate/>
            </Setter.Value>
        </Setter>
    </Style>
    

    资料来源:
  • ThemeInfoAttribute Constructor
  • ResourceDictionaryLocation Enumeration
  • Windows Presentation Foundation-Das Umfassende Handbuch,Rheinwerk Computing版本4
  • 10-06 07:54