Frage

Ich muss WPF -Typen (z. B. eine UserControl oder eine Seite) über Reflexion für einen Designer instanziieren. Das Problem, das ich habe, ist, dass ich, wenn ich versuche, diese mit Aktivator zu instanziieren. TargetInvocationException welche am Ende eine Ausnahme von der ausgelöst wird Staticresource Markup -Erweiterung.

Klarstellung: Die Typen befinden sich in einer anderen Baugruppe, die zur Laufzeit geladen wird!

Offenbar, Activator.Createinstance kann nicht typen instanziieren, die die verwenden {StaticResource xxx} Markup -Erweiterung, Auch wenn die statische Ressource in der Definition des Typs definiert ist.

Wenn Sie also nur die Definition des folgenden Typs haben (Typ + xaml -Datei):

<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>

Wie würdest du das zur Laufzeit drinnen?

Übrigens, Es ist nicht akzeptabel, stattdessen DynamicResource zu verlangen. Benötigt Visual Studio dies? Dennoch ist VS in der Lage, eine Kopie Ihres WPF -Framework -Elements zu verbessern und in den Designer zu stecken.


Hier ist eine Beispielanwendung (Beta 2, sorry), die das Problem demonstriert.

http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/public/Resourcesgokaboom.zip

Die App versucht, eine Seite mit einer Zeichnung in ihrem Ressourcenwörterbuch zu laden. Ich versuche, es dynamisch mithilfe zu laden Application.loadComponent und Activator.Createinstance Und beide scheitern.


Okay, das obige Beispiel funktioniert ohne ein Problem. Das Problem war, dass ich eine staticResource innerhalb der Attribute eines Elements verwendete, die auf eine in diesem Element definierte Ressource bezog.

Was mich warf war, war das Dies funktioniert in Visual Studio. Also sah im Designer alles Okey Dokey aus, aber IRL war alles birne geformt. IMHO, das ist ein Fehler und ich habe ihn als solches gemeldet:

https://connect.microsoft.com/visualstudio/feedback/viewfeedback.aspx?feedbackid=519244

Ich bin mir nicht sicher, ob es ein Versagen von VS ist, ... zu scheitern, oder ob die staticResource -Erweiterung in VS, aber nicht in IRL funktioniert.

War es hilfreich?

Lösung

Das Problem scheint mit der Seite zu gelangen, die Sie laden möchten. Ihre Seite sieht so aus (aus einer Reihe von XMLNs usw. ausgelassen):

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

Dies versucht, die AwesomeFace -Ressource zu verwenden, bevor sie definiert ist. StaticResource erlaubt diese Art von Vorwärtsbeweis nicht: Daher scheitert die staticResourceEXTension.

Um dies zu beheben, legen Sie einen Rand unmittelbar in die Seite und verschieben Sie den Hintergrund -Setter von der Seite auf den Rand. Legen Sie dann alle Ihre Inhalte in den Grenze.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top