1

我需要通过反射为设计器实例化 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.LoadComponentActivator.CreateInstance动态加载它,但它们都失败了。


好的,上面的例子没有问题。问题是我在元素的属性中使用了 StaticResource,它引用了在该元素中定义的资源。

让我感到震惊的是,这在视觉工作室中有效。 所以在设计师那里,一切看起来都还不错,但 IRL 都是梨形的。恕我直言,这是一个错误,我已将其报告为:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=519244

不确定它是否是 VS 的失败……失败,或者 StaticResource 扩展是否在 VS 中工作但不是 IRL。

4

1 回答 1

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 失败,您会遇到遇到的错误。

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

于 2009-12-08T23:29:35.547 回答