1

デザイナーのリフレクションを介して WPF 型 (UserControl や Page など) をインスタンス化する必要があります。私が抱えている問題は、Activator.CreateInstance を使用してこれらをインスタンス化しようとすると、最終的にStaticResourceマークアップ拡張によってスローされた例外をラップするTargetInvocationExceptionを取得することです。

明確化: 型は、実行時に読み込まれる別のアセンブリにあります。

どうやら、型の定義で静的リソースが定義されている場合でも、 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 フレームワーク要素のコピーをスピンアップしてデザイナーに貼り付けることができます。


この問題を示すサンプル アプリケーション (ベータ 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 は失敗し、遭遇したエラーが発生します。

これを修正するには、Border を Page のすぐ内側に配置し、Background セッターを Page から Border に移動します。次に、すべてのコンテンツを Border 内に配置します。

于 2009-12-08T23:29:35.547 に答える