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