如何在具有StaticResources的情况下通过类型实例化WPF元素?

时间:2009-12-08 21:26:01

标签: wpf reflection instantiation staticresource

我需要通过设计器的反射来实例化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。

1 个答案:

答案 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失败并且您得到了您遇到的错误。

要解决此问题,请将“边框”立即放在“页面”内,然后将“背景”设置器从“页面”移动到“边框”。然后将所有内容放入边框。