Il motore di Windows Presentation Foundations basa pesantemente le sue funzionalità sulle DependencyProperty sfruttate da data binding, animazioni e stili. Queste tipologia di proprietà vivono grazie all'oggetto DependencyObject dal quale la maggior parte degli oggetti di WPF ereditano. Tutto questo permette di beneficiare di tutte le funzionalità di WPF che lo contraddistinguono da molti altri framework, ma purtroppo ha un costo proporzionale al numero degli oggetti presenti, che grava sulla memoria occupata dal processo, sul carico della cpu e sulle prestazioni di caricamento dell'applicazione.
Esiste però una specializzazione di tipo Freezable, dal quale ereditano oggetti come Brush, Drawing, Geometry, Effect, Trasformation e Timeline che permette in certe condizioni di bloccare le impostazioni dell'oggetto in modo da disattivare tutte le funzionalità di monitoraggio dell'oggetto. In questo modo si alleggerisce il motore aumentando in generale le prestazioni dell'applicazioni.
E' possibile quindi intervenire su quegli oggetti che non sono animati o in data binding e dei quali si è certi che i loro valori non vengano cambiati nel tempo. Per farlo basta chiamare il metodo Freeze assicurandosi che tale operazioni possa essere fatta, interrogando la proprietà CanFreeze.
SolidColorBrush myBrush = new SolidColorBrush(Colors.Red); if (myBrush.CanFreeze) { myBrush.Freeze(); } Button myButton = new Button(); myButton.Background = myBrush;
Nell'esempio precedente, qualsiasi modifica all'oggetto myBrush genera un'eccezione se non clonando l'intero oggetto con il metodo Clone.
Gli oggetti che sono i candidati ideali per essere bloccati sono quelli risiedenti nelle risorse perché solitamente questi non vengono animati. E' possibile quindi bloccarli attraverso il markup e uno specifico namespace che permette di porre l'attributo Freeze sugli oggetti.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="PresentationOptions"> <Window.Resources> <SolidColorBrush x:Key="myBrush" PresentationOptions:Freeze="True" Color="Red" /> </Window.Resources> <Button Content="Premi qua!" Background="{StaticResource myBrush}"> </Button> </Window>
Di regola è bene quindi porre tale attributo su ogni risorsa ed eventualmente impostarlo a False qualora si debba animare l'oggetto. Si consideri inoltre che gli oggetti inseriti in uno Style subiscono già automaticamente il Freeze se supportano tale funzionalità e se si trovano nelle condizioni adatte.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Accedere con ASP.NET ad un documento XML creato dall'oggetto recordset di ADO e ASP
- Richiamare programmaticamente le operazioni di aggiornamento, eliminazione e inserimento di FormView, DetailsView e GridView
- Aumentare la scalabilità di ASP.NET Core Web API con caching client side
- Visualizzare contenuti Fullscreen con HTML5
- Disabilitare un bottone in una pagina HTML pensando all'accessibilità
- Realizzare siti sicuri con ASP.NET Web Pages
- Focus dei tag input con HTML5
- Disponibile la beta di Silverlight 5
- Ricavare lo spazio occupato su disco dal nostro sito