Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable

di Cristian Civera, in Windows Presentation Foundation, XAML,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

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