La cause la plus fréquente de ceci est si vous renommez un assemblage. Je vais expliquer ce scénario, puis donner d'autres possibilités.
Supposons que vous avez un projet DLL "Abc" contenant UserControl "MyControl". Le InitializeComponent généré pour MyControl dans Abc.dll contiendra le Uri "/Abc;Component/MyControl.xaml".
Lors de l'exécution, le nom de l'assembly "Abc" est extrait et les assemblys chargés sont recherchés pour un assembly de ce nom. Si un tel assembly est trouvé mais qu'il n'a pas de ressource "MyControl.xaml", vous obtenez l'erreur que vous avez affichée dans la question.
Voici donc le scénario:
- renommer le fichier Abc.dll à Def.dll
- Vous (ou quelqu'un) crée un fichier Abc.dll différent
- Dans votre projet, vous faites référence Def.dll (qui a été compilé comme Abc.dll)
- Votre projet a également directement ou indirectement des références Abc.dll il est chargé lorsque MyControl est instancié
Maintenant, lorsque vous instanciez MyControl à partir Def.dll, il recherche son xaml dans l'assembly Abc.dll au lieu de l'assembly Def.dll.
D'autres scénarios dans lesquels cela peut se produire:
Vous avez un fichier .g.cs périmé dans votre répertoire obj qui a le mauvais nom pour le fichier XAML. Cela peut se produire si vous avez modifié le code source sans mettre à jour la date (ce qui peut se produire lors d'une extraction à partir d'un système de contrôle de source ou d'un dézippage d'un fichier zip ou de plusieurs autres façons). Le nettoyage et la reconstruction de la solution permettront de résoudre ce problème. Puisque votre commentaire dit que vous avez essayé cela, cela ne s'applique pas à vous.
Vous modifiez manuellement les noms de ressources dans le fichier .dll après qu'il a été compilé
Vous avez chargé deux assemblées avec le même nom (oui, cela est possible), et le chargeur de ressources trouvé le mauvais un
Notez que toute modification du chemin d'accès au fichier XAML, comme changement de nom ou de le déplacer, peut provoquer ce problème si le fichier .g.cs ne correspond pas au chemin dans les ressources.
Pour diagnostiquer votre problème plus loin, je vous recommande de télécharger une copie de NET Reflector et de regarder votre.Fichier dll à voir:
- Qu'est-ce que Uri fait pour InitializeComponent()?
- Existe-t-il un fichier .baml portant le même nom?
Vous pouvez également examiner la pile d'appels au point où l'exception est levée pour vous assurer que le gestionnaire de ressources utilisé contient une référence à l'assembly attendu, et non un autre assembly.
solution propre et la reconstruction, peut-être cela aidera. –
Déjà essayé cela en vain. –
Etrange ... J'ai créé une nouvelle compilation pour essayer la réponse de Ray Burns ci-dessous et maintenant ça semble fonctionner correctement. J'aurais juré que j'avais fait au moins deux cycles de construction propre. –