Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Definire gli stili in XAML nel posto giusto...

L'altra sera, lavorando sul mio plug-in, mi sono posto una questione. Supponiamo di avere uno stile definito nello XAML nel modo seguente:

<Button x:Class="VivendoByte.Emoticons.EmoticonButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Margin="2"> <Button.Resources> <Style x:Key="normal"> <Setter Property="Image.Margin" Value="8"/> <Style.Triggers> <Trigger Property="Image.IsMouseOver" Value="True"> <Setter Property="Image.Margin" Value="2"/> </Trigger> </Style.Triggers> </Style> </Button.Resources> <Image Name="imgEmoticon" Style="{StaticResource normal}"> </Image> </Button>

Il codice XAML qui sopra definisce una classe EmoticonButton che eredita da Button. Ho inserito una risorsa, alla quale si può fare riferimento con Style="{StaticResource normal}". Non mi sembra un buon affare, perchè se questo EmoticonButton viene utilizzato per n volte su una Window, anche la risorsa viene dichiarata per n volte, infinitamente uguale a se stessa. Credo che sia uno spreco di risorse, e senza doppi sensi.

Mi sono quindi chiesto: posso definire la risorsa normal al di fuori della classe, magari all'interno delle risorse della Window su cui poi andrò ad utilizzare la classe EmoticonButton. Ho provato mantenendo la valorizzazione della proprietà Style lì dov'è. La compilazione va a buon fine, perchè se è vero che a design-time la risorsa normal non esiste, è anche pur vero che questa potrebbe essere iniettata via codice da qualche parte (comunque prima dell'esecuzione della InitializeComponent). Supponiamo quindi di avere la risorsa definita all'interno della Window ChooseEmoticon: invece di <Button.Resources>...</Button.Resources> il tutto è incluso dentro <Window.Resources>...</Window.Resources>. Il tutto comunque non funziona, perchè quando istanzio un oggetto EmoticonButton la risorsa normal non esiste, come in effetti è. La classe EmoticonButton dovrebbe accorgersi della presenza della risorsa normal solo quando viene aggiunto alla Window ChooseEmoticon. Improbabile, è più giusto che mi sollevi un'exception.

Mi sono comportato in modo diverso. Ho lasciato lo XAML che definisce l'EmoticonButton più pulito e semplice:

<Button x:Class="VivendoByte.Emoticons.EmoticonButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Margin="2"> <Image Name="imgEmoticon"> </Image> </Button>

Allo stile non ho più dato alcuna x:Key, ma l'ho semplicemente associato ad un TargetType specifico, in questo modo:

<Window.Resources> <Style TargetType="{x:Type Image}"> <Setter Property="Image.Margin" Value="8"/> <Style.Triggers> <Trigger Property="Image.IsMouseOver" Value="True"> <Setter Property="Image.Margin" Value="2"/> </Trigger> </Style.Triggers> </Style> </Window.Resources>

Lo stile in questo modo viene applicato automaticamente a tutti gli oggetti di tipo Image che sono contenuti nel visual tree della Window. Da oggi, quindi, gli EmoticonButton hanno un divertente effetto: quando gli si passa sopra con il mouse, l'immagine contenuta (l'emoticon oppure l'immagine del folder) viene leggermente ingrandito. Normalmente infatti l'Image lascia un Margin di 8. Grazie ad un semplice trigger (scatenato quando la proprietà IsMouseOver = true) il Margin diventa 2.

Osservazioni, correzioni ed altre idee più pulite sono ben accette.

Print | posted on Wednesday, February 28, 2007 6:08 PM | Filed Under [ Sviluppo .NET ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET