2014-07-14 5 views
1

J'ai créé une extension de balisage:Comment remapper correctement mon espace de noms XAML?

namespace Utils 
{ 
    public class CoolExtension : MarkupExtension 
    { 
     private string key; 

     public CoolExtension() 
     { 
     } 

     public CoolExtension(string key) 
     { 
      this.key = key; 
     } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return "!"+key+"!"; 
     } 
    } 
} 

Ensuite, j'ai ajouté dans le AssemblyInfo le XmlnsDefinitionAttribute remapper l'espace de noms Utils à défaut-namespace, de sorte que je ne pas besoin d'un espace de noms pour utiliser l'extension de balisage:

[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")] 

Enfin, dans ma fenêtre je l'extension:

<Button Content="{Cool test}" /> 

le XAML Editor souligne ne pas quoi que ce soit pour afficher une erreur et le XAML-Designer montre la sortie comme prévu (un bouton avec "! test!" comme contenu).

Mais il ne compile pas! Dans la liste des erreurs j'ai le message que "Cool" n'a pas été trouvé dans l'espace de nom http://schemas.microsoft.com/

Qu'est-ce que je fais mal (pour se débarrasser de l'espace de noms pour mon extension)?

Répondre

2

Malheureusement, WPF ne supporte pas cela dans le même assemblage. La cause première qui empêche l'utilisation de XmlnsDefinition dans le même espace de noms est que le fichier XAML doit être analysé avant la génération de l'assembly afin de générer le code impliqué par le code XAML à inclure dans l'assembly.

Le compilateur produit du code XAML derrière les fichiers (les fichiers se terminant par, par exemple, .g.cs) et ces fichiers deviennent alors partie de l'ensemble du fichier XAML est contenu.

Depuis l'assemblée n » Le compilateur XAML ne peut pas le charger pour déterminer si les attributs XmlnsDeclaration ont été spécifiés.

+0

C'est vrai. Vous devez simplement placer votre extension de balisage et la définition de l'espace de noms XAML dans un autre assembly, puis la référencer dans l'assembly où vous souhaitez l'utiliser dans XAML. J'utilise cette solution de contournement tout le temps. – user1018735

Questions connexes