将样式和控件从另一个程序集导入 WPF 应用程序的正确方法是什么?

What is the correct way to import styles and controls from another assembly into a WPF Application?

我有一个 Class 库项目,其中包含默认控件和样式。我从该项目创建了一个 Nuget 包。然后我尝试使用 Visual Studio 中的包管理器来添加对另一个项目的引用,但这就是我遇到问题的地方。

引用已成功添加,但随后我无法从消费者项目的 MergedDictionaries 属性 中的 ResourceDictionary 中的打包项目访问 App.xaml 文件App.xaml 文件:

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

我在该行收到一个内联错误(未显示在错误列表中),说明:

Assembly 'DefaultStyles' is not referenced by this project

但是它项目引用的。我可以在 Project References 中看到引用,并且我对引用项目中的控件具有 Intellisense。

此外,项目构建成功,但我在错误列表中显示了两个类似的错误:

The name "ImageWithSingleTextLine" does not exist in the namespace "clr-namespace:DefaultStyles.ItemTemplates;assembly=DefaultStyles".

但它确实存在于其中并且我得到了它的 Intellisense,因此如果我尝试再次编写该行,它会自动为我完成...然后 然后 给出又是我的错误。再多的清洁、建造和重建也无法解决问题。

直到我尝试 运行 应用程序,我才得到进一步的线索。 XamlParseExceptionApp.xaml.cs 构造函数中抛出,说明:

The invocation of the constructor on type 'DefaultStyles.App' that matches the specified binding constraints threw an exception.

它还有一个类型为InvalidOperationException的内部异常:

Cannot create more than one System.Windows.Application instance in the same AppDomain.

所以,这似乎是问题的根本原因。在默认样式项目中,我广泛使用了 App.xaml 文件,并在 App.xaml.cs 代码隐藏文件中添加了一个事件处理程序。

我的问题是我怎样才能让这一切正常进行?

正如您正确发现的那样,在一个 AppDomain 中不能有超过一个 Application class 的实例。解决方案是将 App.xaml 文件的内容移动到 ResourceDictionary 中并改用它。如果需要,您仍然可以将代码隐藏文件用于标准 ResourceDictionary