我需要通过反射为设计器实例化 WPF 类型(例如,UserControl 或 Page)。我遇到的问题是,当我尝试使用 Activator.CreateInstance 实例化这些时,我得到一个TargetInvocationException ,它最终包装了由StaticResource标记扩展引发的异常。
澄清:这些类型在运行时加载的不同程序集中!
显然,Activator.CreateInstance无法实例化使用{StaticResource XXX}标记扩展的类型,即使在类型定义中定义了静态资源也是如此。
因此,如果您只有以下类型的定义(类型 + xaml 文件):
<Page x:Class="Hurr.Durr">
<Page.Resources>
<ControlTemplate x:Key="whatever">
<TextBlock Text="This is a stupid example."/>
</ControlTemplate>
</Page.Resources>
<ContentControl Template="{StaticResource whatever}" />
</Page>
您将如何在运行时启动它?
顺便说一句,要求您使用 DynamicResource 是不可接受的。Visual Studio 需要这个吗?然而,VS 能够启动您的 WPF 框架元素的副本并将其粘贴到设计器中。
这是一个演示该问题的示例应用程序(beta 2,抱歉)。
http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/Public/ResourcesGoKaboom.zip
该应用程序尝试在其资源字典中加载带有绘图的页面。我尝试使用Application.LoadComponent和Activator.CreateInstance动态加载它,但它们都失败了。
好的,上面的例子没有问题。问题是我在元素的属性中使用了 StaticResource,它引用了在该元素中定义的资源。
让我感到震惊的是,这在视觉工作室中有效。 所以在设计师那里,一切看起来都还不错,但 IRL 都是梨形的。恕我直言,这是一个错误,我已将其报告为:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=519244
不确定它是否是 VS 的失败……失败,或者 StaticResource 扩展是否在 VS 中工作但不是 IRL。