2009-12-08 5 views
1

J'ai besoin d'instancier des types WPF (par exemple, un UserControl ou une Page) via la réflexion pour un concepteur. Le problème que j'ai est que quand j'essaye d'instancier ceux-ci using Activator.CreateInstance j'obtiens un TargetInvocationException qui encapsule, à la fin, une exception levée par l'extension de balisage StaticResource.Comment est-ce que je peux instancier des éléments de WPF par leur type quand ils ont StaticResources?

Clarification: Les types sont dans un ensemble différent qui est chargé à l'exécution!

Apparemment, Activator.CreateInstance ne peut pas instancier les types qui utilisent le {StaticResource XXX} extension de balisage, même lorsque la ressource statique est définie dans la définition du type.

Donc, si vous ne disposez que la définition de type suivant (type + fichier 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> 

Comment qualifieriez-vous tourner cette place lors de l'exécution?

BTW, l'utilisation de DynamicResource à la place n'est pas acceptable. Est-ce que Visual Studio l'exige? Pourtant, VS est capable de générer une copie de votre élément de cadre WPF et de le coller dans le concepteur.


Voici un exemple d'application (bêta 2, désolé) qui illustre le problème.

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

L'application tente de charger une page avec un dessin dans son dictionnaire de ressources. J'essaie de le charger dynamiquement en utilisant Application.LoadComponent et Activator.CreateInstance et ils échouent tous les deux.


Bon, l'exemple ci-dessus fonctionne sans problème. Le problème était que j'utilisais une StaticResource dans les attributs d'un élément qui référencent une ressource définie dans cet élément. Ce qui me lançait était que cela fonctionne dans le studio visuel. Donc dans le concepteur tout avait l'air okey dokey mais IRL tout était en forme de poire. À mon humble avis, c'est un bug et je l'ai signalé comme tel:

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

Je ne sais pas si son échec de VS à .... échec, ou si l'extension StaticResource travaillait dans VS, mais pas IRL.

+0

Je ne peux pas reproduire ce problème - l'objet Page instancie correctement avec Activator.CreateInstance, et je peux utiliser la page instanciée dans un cadre, et le ContentControl et le modèle TextBlock s'affichent correctement. Pourriez-vous fournir plus de détails sur l'exception interne qui vous fait penser que c'est lié à StaticResource? Pouvez-vous confirmer que vous voyez l'échec même avec cet exemple simplifié? – itowlson

+0

Création d'un exemple de projet maintenant. – Will

+0

btw, c'est incroyable je n'ai pas bousillé le xaml lorsque je l'ai tapé de la mémoire dans l'éditeur de SO. – Will

Répondre

1

Le problème semble provenir de la page que vous essayez de charger. Votre page ressemble à ceci (l'omission d'un tas de xmlns etc. plomberie):

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

Cette tente d'utiliser la ressource awesomeface avant qu'elle soit définie. StaticResource n'autorise pas ce type de référencement: le StaticResourceExtension.ProvideValue échoue et vous obtenez l'erreur que vous avez rencontrée.Pour résoudre ce problème, placez une bordure immédiatement à l'intérieur de la page et déplacez le paramètre Background depuis la page jusqu'à la bordure. Ensuite, mettez tout votre contenu à l'intérieur de la frontière.

+0

Hmmmmm ........ Il fonctionne en VS, mais il ne fonctionne pas * en dehors de VS *. Laissez-moi vérifier plus à ce sujet ... – Will

+0

Bon, ça marche. Ce qui me dérangeait, c'était que ça fonctionnait en studio visuel, mais ça ne marche pas quand l'application fonctionne. Ceci, à mon humble avis, est un bug. – Will

Questions connexes