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

标签 wpf .net-4.0

我有一个 WPF 应用程序,需要能够根据 Uri 加载预定义的 UserControl。我正在使用 Application.LoadComponent(Uri) 来执行此操作,但它现在抛出 IOException 并显示 无法定位资源...

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

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

但是,我需要能够将自定义控件动态加载控件移动到应用程序集未直接引用的另一个程序集中(由于第二个程序集将引用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

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

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

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

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

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

最佳答案

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

为了实现这一点,我必须使用以下形式:

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

组件部分是硬编码的;它不在我的程序集中的任何地方,但它似乎是加载组件所必需的。如果有人可以提供包含这些数据的答案,并提供更全面的解释为什么会出现这种情况,我很乐意接受!

归功于this blog post帮助我。

关于wpf - 从未引用的程序集加载时,Application.LoadComponent 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430642/

相关文章:

wpf - 当鼠标指针离开 UIElement 时如何确定鼠标按钮是否被按下

c# - 观察集合中项目的 PropertyChanged

c# - 在调用 CompleteAdding 后添加到 BlockingCollection

.net-4.0 - 为什么 ccrewrite.exe 没有从命令行执行任何操作?

c# - 如何在不绑定(bind)任何东西的情况下创建 wpf 数据网格?

c# - 检查 SQLite 表输入字段 - C# WPF

c# - 简单的 WPF 数据绑定(bind)导致 StackOverFlow 异常

c# - 仅在选择 ListViewItem 时显示内容

.net - .NET 控制台应用程序中的 Thread.CurrentPrincipal

c# - 如何在 HTML head 中查找和删除 CSS 引用?