Domanda

Ho bisogno di istanziare i tipi WPF (ad esempio, un UserControl o di una pagina) attraverso la riflessione per un designer. Il problema che sto avendo è che quando tento di creare un'istanza di questi utilizzando Activator.CreateInstance ho un TargetInvocationException , che avvolge, alla fine, un'eccezione generata dalla StaticResource markup estensione.

Chiarimento: Le tipologie sono in un assembly diverso che viene caricato in fase di esecuzione

!

A quanto pare, Activator.CreateInstance non può istanziare i tipi che utilizzano il {StaticResource XXX} estensione di markup, anche quando la risorsa statica è definito nel tipo di definizione.

Quindi, se hai a disposizione solo la definizione del seguente tipo (file XAML Tipo +):

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

Come vi girare questo in su in fase di esecuzione?

tra , che richiede di utilizzare DynamicResource invece non è accettabile. Ha Visual Studio richiedono questo? Eppure VS è in grado di girare su una copia del WPF elemento quadro e incollarla nella finestra di progettazione.


Ecco un'applicazione di esempio (beta 2, sorry) che dimostra il problema.

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

L'applicazione tenta di caricare una pagina con un disegno nel suo dizionario risorse. Io cerco di caricarlo in modo dinamico utilizzando Application.LoadComponent e Activator.CreateInstance ed entrambi falliscono.


D'accordo, l'esempio precedente funziona senza un problema. Il problema era che stavo usando uno StaticResource all'interno di attributi di un elemento che fa riferimento una risorsa definita all'interno di tale elemento.

Quello che mi stava gettando era che questo funziona all'interno di Visual Studio. Quindi, in tutto il progettista sembrava okey dokey ma IRL era a forma di pera tutto. IMHO, questo è un bug e ho segnalato come tale:

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

Non sono sicuro se la sua mancanza di VS per .... fallire, o se l'estensione StaticResource stava lavorando in VS, ma non IRL.

È stato utile?

Soluzione

Il problema sembra essere con la pagina che stai cercando di caricare. La vostra pagina si presenta così (omettendo un mazzo di xmlns ecc idraulico):

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

Questo tenta di utilizzare la risorsa awesomeface prima che venga definita. StaticResource non consente questo tipo di riferimento in avanti:. Quindi lo StaticResourceExtension.ProvideValue non riesce e si ottiene l'errore è stato eseguito in

Per risolvere questo problema, inserire un bordo immediatamente all'interno della pagina, e spostare il setter di sfondo dalla pagina al confine. Poi mettere tutti i tuoi contenuti all'interno del bordo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top