无法从另一个程序集实例化 UserControl - 找不到资源

Cannot instantiate UserControl from another assembly - Resource cannot be found

我有一个包含两个 WPF 项目的解决方案:Primary 和 Secondary。

在 Primary 项目中,一个名为 PrimaryView 的 Window 实例化了一个名为 SecondaryControl 的 UserControl,该控件在 Secondary 项目中定义。

SecondaryControl 使用在 SecondaryResourceDictionary 中定义的 SecondaryStyle(您可能已经猜到了,在 SecondaryProject 中定义)。

事实是:当我尝试 运行 解决方案时,我得到一个 XamlParseError,并挖掘 InnerExceptions 我最终找到了罪魁祸首,ResourceNotFound 错误。

所以我的问题是:

  • If SecondaryControl and its SecondaryStyle are defined in the same assembly, why can't I instantiate it it PrimaryAssembly?

  • Should I make SecondaryStyle available to PrimaryProject namespace somehow? Why?

我试图通过解释它在我的项目中的工作方式来帮助你。 一个单独的程序集包含一个公共控件和公共资源字典,如下所示:

CommonResources.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--  Some resources  --> 

</ResourceDictionary>

SomeCommonControl.xaml

<UserControl x:Class="YourAssembly.SomeCommonControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/YourAssembly;component/CommonResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

    <!-- Some specific content -->

</UserControl>

我可以像这样使用来自其他程序集和 WPF 项目的控件和资源:

<Window x:Class="YourWPFProject.SomeWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:common="clr-namespace:YourAssembly">

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/YourAssembly;component/CommonResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <common:SomeCommonControl />

</Window>

希望对您有所帮助。