从未引用的程序集加载时,Application.LoadComponent失败

时间:2011-06-21 19:05:40

标签: wpf .net-4.0

我有一个WPF应用程序需要能够基于Uri加载预定义的UserControl。我正在使用Application.LoadComponent(Uri)来执行此操作,但现在正在使用IOException投放Cannot locate resource...

我的原始架构看起来像这样并且按预期工作:

Application Assembly/
    Main Window.xaml
    Custom Control.xaml
    Dynamically Loaded Control.xaml
Second Assembly/
    Class that executes Application.LoadComponent("Dynamically Loaded Control.xaml")

但是,我需要能够将Custom ControlDynamically Loaded Control移动到另一个未被Application Assembly直接引用的程序集中(因为此第二个程序集将引用Application Assembly,因此引用将是循环的;可能还有其他程序集在​​核心应用程序的编译时是未知的,所以这是一个明确的要求)。

我已经重新设计了它,现在看起来像这样:

Application Assembly/
    Main Window.xaml
Second Assembly/
    Class that executes Application.LoadComponent("Dynamically Loaded Control.xaml")
Third Assembly
    Custom Control.xaml
    Dynamically Loaded Control.xaml

我可以在按文件名加载Custom Control.xaml之后动态实例化DataTemplateSelector(通过自定义Third Assembly),这可以按预期工作。但是,Second Assembly中的类现在在将相同路径传递给动态添加的控件时抛出上述异常。路径(在程序集中)没有改变,我试过了两个:

Application.LoadComponent("Dynamically Loaded Control.xaml");

Application.LoadComponent("Third Assembly;Dynamically Loaded Control.xaml");

不幸的是,两者都产生了相同的结果。我能想到的唯一问题是自定义和动态控件现在位于一个显式加载而不是通过引用加载的程序集中,但我不确定为什么会产生影响。

如何让Application.LoadComponent正确加载编译成我在运行时显式加载的程序集的组件?

1 个答案:

答案 0 :(得分:4)

一旦我决定发布问题,我设法在一小时内找到解决方案。

为了实现这一目标,我必须使用以下表格:

Application.LoadComponent(
    "/Third Assembly;component/Dynamically Loaded Control.xaml");

component部分是硬编码的;这在任何地方都不在我的程序集中,但似乎需要加载组件。如果有人能提供包含这些数据的答案并提供更详尽的解释,为什么会这样,我很乐意接受它!

感谢this blog post帮助我。