我需要通过设计器的反射来实例化WPF类型(比如,UserControl或Page)。我遇到的问题是,当我尝试使用Activator.CreateInstance实例化这些时,我得到一个 TargetInvocationException ,它最终包装了 StaticResource 标记抛出的异常扩展
澄清:类型位于运行时加载的不同程序集中!
显然, Activator.CreateInstance 无法实例化使用 {StaticResource XXX} 标记扩展名的类型,即使在类型中定义静态资源时也是如此定义的
所以,如果您拥有的是以下类型的定义(Type + 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>
你如何在运行时旋转它?
BTW ,要求您使用DynamicResource是不可接受的。 Visual Studio是否需要这个?然而,VS能够启动WPF框架元素的副本并将其粘贴在设计器中。
以下是演示此问题的示例应用程序(测试版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。
答案 0 :(得分:1)
问题似乎与您尝试加载的网页有关。你的页面看起来像这样(省略了一堆xmlns等管道):
<AwesomePage Title="AwesomePage" Background="{StaticResource awesomeface}">
<AwesomePage.Resources>
<DrawingBrush x:Key="awesomeface" Stretch="Uniform">
<!-- details snipped -->
</DrawingBrush>
</AwesomePage.Resources>
</AwesomePage>
尝试在定义之前使用awesomeface资源。 StaticResource不允许这种前向引用:因此StaticResourceExtension.ProvideValue失败并且您得到了您遇到的错误。
要解决此问题,请将“边框”立即放在“页面”内,然后将“背景”设置器从“页面”移动到“边框”。然后将所有内容放入边框。