Definire un XML namespace per una libreria di controlli WPF

Scritto da  Marco Amendola il giovedì 3 giugno 2010  •  Linguaggio:    • Livello: 100


Supponiamo di aver definito un controllo MyControl all'interno di una libreria DomusDotNetPills.Controls:

namespace DomusDotNetPills.Controls
{
public class MyControl: Control
{

}
}

Per utilizzarlo all'interno di documento XAML, com'è noto, occorre definire un alias per il namespace CLR del controllo e qualificare tutte le istanze con l'alias scelto:

<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="clr-namespace:DomusDotNetPills.Controls;assembly=DomusDotNetPills.Controls"
>
<Grid>
<ddnp:MyControl />
</Grid>
</Window>

L'espressione clr-namespace:DomusDotNetPills.Controls;assembly=DomusDotNetPills.Controls identifica univocamente il namespace CLR all'interno di un determinato assembly.
Per utilizzare, al posto di questa espressione, un namespace XML, occorre prima di tutto definirlo nell'assembly contenente il controllo; aggiungendo l'attributo

[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls")]

all'interno del file AssemblyInfo.cs si ottiene l'associazione del namaspace CLRDomusDotNetPills.Controls con il più leggibile e appropriato namespace XML.
A questo punto l'alias può essere dichiarato nello XAML come segue

<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="http://domusdotnet.org/pills/xaml""
>
<Grid>
<ddnp:MyControl />
</Grid>
</Window>

Oltre alla maggiore leggibilità, si ottiene il vantaggio di poter includere nello stesso namespace XML diversi namespace CLR, similmente a quanto avviene con i controlli WPF standard (mentre normalmente sarebbe stato necessario dichiarare diversi alias):

namespace DomusDotNetPills.Controls.Advanced
{
public class MyAdvancedControl: Control
{

}
}

 

[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls")]
[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls.Advanced")]
<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="http://domusdotnet.org/pills/xaml""
>
<StackPanel>
<ddnp:MyControl />
<ddnp:MyAdvancedControl />
</StackPanel>
</Window>


Tags: WPF,XAML

 
x