我有一个 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/