代码之家  ›  专栏  ›  技术社区  ›  Will

当wpf元素具有静态资源时,如何通过它们的类型实例化它们?

  •  1
  • Will  · 技术社区  · 15 年前

    我需要通过对设计器的反射来实例化WPF类型(例如,用户控件或页面)。我遇到的问题是,当我尝试使用activator.createInstance实例化这些实例时,我会得到一个 目标调用异常 最后,它包装了一个由 静态源 标记扩展。

    说明:类型位于运行时加载的不同程序集中!

    显然地, Activator.CreateInstance 无法实例化使用 静态资源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>
    

    在运行时,您将如何进行旋转?

    顺便说一句 ,要求您改用dynamicsource是不可接受的。Visual Studio是否需要此功能?然而,VS能够旋转一个WPF框架元素的副本,并将其粘贴到设计器中。


    这里有一个示例应用程序(beta 2,抱歉)演示了这个问题。

    http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/Public/ResourcesGoKaboom.zip

    该应用程序尝试在其资源字典中加载带有绘图的页面。我尝试使用动态加载 应用程序.loadcomponent Activator.CreateInstance 他们都失败了。


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

    把我扔出去的是 这在Visual Studio中工作。 所以在设计师看来一切都很好,但IRL都是梨形的。imho,这是一个bug,我已经这样报告了它:

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

    不确定这是不是一个失败的vs to…失败,或者如果staticresource扩展在vs而不是irl中工作。

    1 回复  |  直到 15 年前
        1
  •  1
  •   itowlson    15 年前

    问题似乎出在您试图加载的页面上。您的页面如下(省略了一组xmln等管道):

    <AwesomePage Title="AwesomePage" Background="{StaticResource awesomeface}">
        <AwesomePage.Resources>
            <DrawingBrush x:Key="awesomeface" Stretch="Uniform">
                <!-- details snipped -->
            </DrawingBrush>
        </AwesomePage.Resources>
    </AwesomePage>
    

    这将尝试在定义awsomeface资源之前使用它。StaticResource不允许这种前向引用:因此StaticResourceExtension.ProvideValue失败,您会得到遇到的错误。

    要解决此问题,请在页面内立即放置边框,然后将后台设置器从页面移到边框。然后把你所有的内容放在边界内。