>

torsdag 4 november 2010

Renare namespace i XAML

När vi vill använda en klass i XAML måste vi först importera namespacet. För en assembly som heter Addskills.dll och där i ett av namespacen heter Addskills.Controls skulle vi infoga följande i våran XAML:

xmlns:a="clr-namespace:Addskills.Controls;assembly=Addskills"

För att sedan använda en kontroll från denna assembly använder vi prefixet innan namnet på kontrollen

<a:SuperTextBox...

Om vi sedan har ett namespace från samma assembly som heter Addskills.Converters och även vill importera detta kan vi inte använda samma prefix

xmlns:aControls=
"clr-namespace:Addskills.Controls;assembly=Addskills"
xmlns:aConverters=
"clr-namespace:Addskills.Converters;assembly=Addskills"

Så kan vi fortsätta men om vi har många namespace vi vill importera blir det ganska många prefix att hålla reda på. Det är då önskvärt att lägga flera clr-namespace på samma xml namespace. Detta går att göra genom attributet XmlnsDefinition. I assemblyt för Addskills.dll letar vi reda på AssemblyInfo filen och lägger till följande:

 [assembly : XmlnsDefinition("http://schemas.addskills.se",
"Addskills.Controls")]
[assembly : XmlnsDefinition("http://schemas.addskills.se",
"Addskills.Converters")]

Den första parametern skall vara ett xml namespace, dessa har formen av ett URI men det behöver inte vara någon adress som finns. För att garantera att vi väljer en unikt xml namespace använder vi domänen vi/företaget äger. Nu när vi skall importera namespacet skriver vi bara följande:

xmlns:a="http://schemas.addskills.se"

Det som också kan vara rekommenderat att göra i samband med XmlnsDefinition är att använda XmlnsPrefix för att ange standard prefixet.

[assembly : XmlnsDefinition("http://schemas.addskills.se",
"Addskills.Controls")]
[assembly : XmlnsDefinition("http://schemas.addskills.se",
"Addskills.Converters")]
[assembly : XmlnsPrefix("http://schemas.addskills.se",
"a" )]

Detta gör att om vi använder drag & drop från toolboxen (då skrivs importen automatiskt) får du 'a' prefixet på namespacet.

Om vi inte vill ha något prefix alls, så som det fungerar med andra befintliga kontroller

[assembly:XmlnsDefinition(
"http://schemas.microsoft.com/winfx/2006/xaml/presentation",
"Addskills.Controls" )]
[assembly:XmlnsDefinition(
"http://schemas.microsoft.com/winfx/2006/xaml/presentation",
"Addskills.Converters" )]

1 kommentar:

  1. Snyggt. Nu kan jag rensa ur en väldig massa xmlns:<...> ur en väldig massa UserControl:er

    SvaraRadera