Un piccolo serpente ci conduce attraverso le principali caratteristiche del Windows Phone 7
Introduzione Core UI & Design Conclusione Premi Discussioni
Marcosroom.it Didatticando

Impostazioni

La pagina delle impostazioni è particolare perchè è l'esempio di una caratteristica un po' particolare. Ma prima, dovremmo parlare del codice! Questo è il diagramma della classe SnakeMobile.Core.Settings.Settings:

Settings class

Diamogli un'occhiata generale: eredita da DependencyObject perchè Acceleration, Sound, SondFx e TotalTimePlayed sono dependency property; OnAccelerationChanged, OnSoundChanged, OnSoundFxChanged e OnTotalTimePlayedChanged sono i metodi di callback per il cambiamento delle precedenti dependency properties. I metodi Load e Save ci consentono di caricare e salvare le impostazioni nell'isolated storage; RestoreDefaultSettings, invece, ripristina tutte le impostazioni di default.

Una proprietà interessante è Instance, ma prima di iniziare a parlarne, dobbiamo andare un po' indietro nel tempo, prima ancora che questa classe venisse creata...

Ho bisogno di una classe che contenga le impostazioni dell'applicazione, quindi una classe statica con delle proprietà statiche è perfetta, poichè le impostazioni devono essere valide per l'intera applicazione, non per una singola istanza della classe. Ma devo ricordarmi che sto utilizzando anche un po' di XAML, quindi, il binding è obbligatorio se devo risparmiare codice, e io DEVO risparmiare codice, quindi ho anche bisogno di una classe con delle proprietà alle quali posso applicare un binding. Questa classe, quindi, deve esporre alcune dependency property (e quindi deve ereditare da DependencyObject), e deve essere statica. In altre parole, devo solo scrivere un po' di dependency property statiche in una classe statica.

EH?!

Quello che ho appena detto è impossibile! Non posso bindare a delle proprietà statiche, quindi ho bisogno di proprietà di istanza; proprietà di istanza significano costruttore, e costruttore NON può significare classe statica! Il problema, quindi, è più grande di quello che pensavo... Come posso bindare ad una proprietà statica all'interno di una classe statica?

Pensa... pensa... pensa... EUREKA!

La classe statica non deve essere statica, ma deve comportarsi come se lo fosse! La classe delle impostazioni non deve essere statica e tutte le proprietà devono essere normali proprietà di istanza. In questo modo, può ereditare da DependencyObject e le proprietà possono essere dependency properties. Ora, non rendo la classe statica, ma, invece, la rendo singleton: rendo il costruttore privato, e creo una proprietà statica di sola lettura chiamata "Instance", e un campo statico "_instance". La proprietà deve ritornare il campo "_instance", e, se il campo è nullo, memorizza una nuova istanza della classe delle impostazioni, e poi lo restituisce.

Traducendo in codice ciò che ho appena detto, questa è la parte più importante:

public class Settings : DependencyObject
{
        
    //Costruttore privato
    private Settings() { }

    //Istanza statica
    private static Settings _instance = null;

    /// <summary>
    /// Istanza della classe
    /// </summary>
    public static Settings Instance {
        get {
            if (_instance == null)
                return _instance = new Settings();
            return _instance;
        }
    }

    // ...
    // Altro codice ...
    // ...


}

Ma la storia non è finita!

Ora, il gioco è fatto! Nella mia pagina Settings, imposto il DataContext alla singola istanza della classe, di modo tale che possa utilizzare il binding nello XAML!

Ciò significa che nel file Settings.xaml.cs (file di codice di Settings.xaml) devo aggiungere solo questa riga di codice...

public partial class Settings : PhoneApplicationPage
{
    public Settings()
    {
        //Component initialization
        InitializeComponent();
        //Data context
        this.DataContext = SnakeMobile.Core.Settings.Settings.Instance;
    }
}

... per utilizzare il two-way binding nello XAML.

<toolkit:ToggleSwitch x:Name="ToggleSound" IsChecked="{Binding Sound, Mode=TwoWay}" />

In questo modo, senza scrivere codice per gestire gli eventi dei controlli, possiamo scrivere una completa pagina di impostazioni, solo utilizzano i binding.

In riferimento ai controlli grafici, dovrei dirti qualcosa riguardo al Pivot, ma non sono un designer, quindi, ti consiglio di leggere questo articolo di Jeff Wilcox, su questo controllo e il suo fratello PanoramaPanorama and Pivot controls for Windows Phone developers

 

Condividi
Indietro Tutti i webmaster che volessero segnalare, non copiare,
il contenuto di questa pagina sul proprio sito, possono farlo liberamente.
E' gradito un preavviso tramite mail all'autore e l'iserimento,
nella pagina di citazione, di un link verso la pagina corrente.
© Copyright    Marco's Room
Avanti
Download SnakeMobile

Scaricato 115 volte

Navigazione Transizioni Pulsante rotondo luminoso Trigger Un piccolo ripasso di matematica Selettore circolare Isolated storage: file e impostazioni Impostazioni Build action: Content o Resource? Audio & XNA