2010-10-29 28 views
1

J'ai un projet contenant un xaml ResourceDictionary que je souhaite utiliser en dehors d'un FrameworkElement. Le dictionnaire de ressources contiendra un DataTemplate pour une classe locale au projet afin d'éviter de polluer le fichier app.xaml (car le projet est un module prisme, et ne sera pas toujours présent en fonction de la configuration). Donc, j'ai un fichier test.xaml avec une action de construction de ressources.Création de WPF ResourceDictionary à partir du code ne semble pas fonctionner lors de la définition de ResourceDictionary.Source

Ceci est destiné à fournir DataTemplate pour une classe TestObject.

Dans la classe TestObject J'ai une méthode getTemplate()

Les travaux suivants:

DataTemplate GetTemplate() 
{ 
    Uri uri = new Uri("MyProject;component/test.xaml", UriKind.Relative); 

    var dict = new ResourceDictionary { Source = uri}; 

    return (DataTemplate)dict["TestObjectDataTemplate"]; 
} 

Ce renvoi d'une exception quand je cède la uri à la propriété ResourceDictionary.Source

DataTemplate GetTemplate() 
{ 
    Uri uri = new Uri("/test.xaml", UriKind.Relative); 

    var dict = new ResourceDictionary { Source = uri}; 

    return (DataTemplate)dict["TestObjectDataTemplate"]; 
} 

Le second exemple échoue car /test.xaml est introuvable dans l'assembly local. Pourquoi aurais-je besoin d'y accéder avec "ReferencedAssembly; component/test.xaml"?

Dans ce cas, l'assemblage local signifie-t-il l'ensemble d'exécution ou l'ensemble dont le code/la ressource fait partie?

Modifier: Mis à jour pour refléter le problème actuel.

Répondre

2

Essayez UriKind.RelativeOrAbsolute.

Plus clairement comme.

DataTemplate GetTemplate() 
    {   
     ResourceDictionary resource = new ResourceDictionary() 
     { 
      Source = new Uri(@"/AssemblyFullName;component/test.xaml", UriKind.RelativeOrAbsolute) 
     }; 

     return (DataTemplate)resource["TestObjectDataTemplate"]; 
    } 

Edit:

Dans ce cas, est-assemblée locale signifie l'ensemble ou l'exécution de l'ensemble le code/ressource fait partie?

Say par exemple:
Vous avez deux projets Projet A et B.

Vous utilisez le projet A comme référence dans le projet B

Maintenant, si vous voulez utiliser la ressource comme ceci /test.xaml. Ensuite, cette ressource doit résider dans le projet B. Depuis, il s'agit de l'assembly en cours d'exécution. [Il sera disponible à la fois pour le projet A et le projet B. Vous pouvez utiliser la syntaxe mentionnée ci-dessus. comme /test.xaml]

Si vous souhaitez que la ressource soit définie et utilisée dans le projet A. Ensuite, vous devez utiliser "/ProjectA;component/test.xaml" car il ne s'agit pas de l'assembly en cours d'exécution. [Il sera disponible à la fois pour le projet A et le projet B. Vous devez utiliser "/ProjectA;component/test.xaml" pour accéder aux deux projets]

+0

J'ai modifié la question pour décrire le problème plus précisément. Un uri relatif fonctionne bien, le problème est que je dois me référer au nom de l'assemblée, malgré les doc msdn qui impliquent qu'un "assembly local" ne devrait pas avoir besoin de cela. – LukeN

+0

@LukeN J'ai mis à jour ma réponse pour votre édition. :) –

+0

C'est ça. Le problème est que http://msdn.microsoft.com/en-us/library/aa970069.aspx dit assembly local et ne pas exécuter l'assembly. J'ai depuis découvert que quelqu'un d'autre l'a trouvé aussi trompeur - http://geekswithblogs.net/NewThingsILearned/archive/2008/04/30/pack-uri-authority---local-assembly--executable.aspx alors que dans Dans votre exemple, je m'attendais à ce que si j'essayais de charger une référence Project A dans le code du projet A, je n'aurais pas besoin de spécifier le nom. À la réflexion, je comprends pourquoi vous pourriez vouloir ce comportement, mais il a été mal décrit. – LukeN

1

En réglant le Source attr fonctionne, je l'ai utilisé avec succès dans de nombreux projets.
Votre Uri peut-être eu tort.Vous devriez essayer un pack complet Uri, comme:

dict.Source = new Uri("pack://application:,,,/test.xaml"); 

Si votre fichier test.xaml n'est pas à la racine du projet, assurez-vous de définir son chemin correctement.