WPF MergedDictionaries - 值不能为空 - 参数名称:item

时间:2016-02-22 23:05:53

标签: c# .net wpf xaml

我的App.Resources MergedDictionary存在一个棘手的问题。每次从另一个程序集添加带有源和XML命名空间的新字典时,都会产生错误,我无法构建我的程序。

错误出现在App.xaml中,ResourceDictionary带有下划线,消息为Value Cannot be Null. Parameter Name: item。这完全没有意义,因为我之前做过完全相同的事情。唯一的区别是,这一次,我引用了另一个程序集的命名空间(c#类库)。这是App.xaml文件:

<Application x:Class="Quiz.Client.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Quiz.Client"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/Styles.xaml" />
                <ResourceDictionary Source="Resources/Templates.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

以下是Styles.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Quiz.Client">

    <Style x:Key="StrongFont"
           TargetType="ContentControl">
        <Setter Property="FontSize"
                Value="20" />
        <Setter Property="FontWeight"
                Value="ExtraBold" />
        <Setter Property="Foreground"
                Value="DarkRed" />
    </Style>


</ResourceDictionary>

这是Templates.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Quiz.Client"
                    xmlns:domain="clr-namespace:Quiz.Core.Domain;assembly=Quiz.Core"
                    xmlns:common="clr-namespace:Quiz.Client.Common">

    <DataTemplate x:Key="ArithmeticQuestionTemplate"
                  DataType="domain:ArithmeticQuestion">

    </DataTemplate>

    <common:QuestionTemplateSelector x:Key="QuestionTemplateSelector"
                                     ArithmeticTemplate="{StaticResource ArithmeticQuestionTemplate}" />

</ResourceDictionary>

到底发生了什么事?是否有引入软件破坏的变化或什么?我完全迷失了。

2 个答案:

答案 0 :(得分:1)

确认!!!此错误由 Microsoft 跟踪。这意味着 WPF 在某些方面将尝试通过 Microsoft 报告过程自动向 Microsoft 报告。在报告 VS 期间开始冻结。请等待错误报告完成。

该bug在lattes VS 2019中依然存在。

重启后一切正常。确认!!!

<块引用>

感谢您的回答。我相信这是由未知原因引起的 Visual Studio 错误。也许我的插件之一,谁知道。解决问题的唯一方法是重新启动 Visual Studio 并构建项目。从另一个程序集中添加新命名空间时,问题似乎开始了。然后,在重新启动 Visual Studio 之前无法构建项目。很奇怪,以前从来没有见过这样的东西。 – 用户3096803

答案 1 :(得分:0)

不确定为什么你的方法不起作用,但这不是我通常自己导入资源的方式。通常我会将ResourceDictionary添加到我的库项目中,将所有库资源放入其中并使用pack语法将其导入到我的主项目中:

<Application.Resources>
    <ResourceDictionary>

        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MyLibrary;component/LibraryResources.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <!-- main project resources go here -->

    </ResourceDictionary>

总的来说,我认为这是一个更好的架构,因为每当其中一个子库资源发生变化时,它不需要重新编译主项目。如果您决定切换到MEF,它也会在以后更容易,因为您的库资源现在封装在一个您可以[Export]的单个ResourceDictionary对象中。