Isolated Storage: memorizziamo i settings della nostra applicazione – Parte 3: implementiamo il pulsante di conferma

Print Content | More

In questo ultimo post dedicato al salvataggio delle impostazioni della nostra applicazioni vedremo come coniugare quello che abbiamo visto nel primo post con la soluzione implementata nel post precendete: utilizzeremo sempre una classe esterna per gestre i nostri settings, ma andremo ad implementare un pulsante di conferma, che deve essere premuto affinchè le modifiche vengano salvate.

Il form

Il form sarà sempre lo stesso utilizzato nei due esempi precedenti: la differenza, rispetto alla soluzione precedente, è che questa volta rimuoveremo dallo XAML tutti gli attributi relativi al binding, dato che non vogliamo più che le impostazioni vengano salvate immediatamente ad ogni modifica.

L’unica novità è che utilizzeremo l’Application Bar di Windows Phone 7, nella quale andremo ad inserire i due pulsanti Save e Cancel.

Ecco perciò il codice XAML del nostro form:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="Settings Biding" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="Settings" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Margin="5">
            <TextBlock Text="Name"></TextBlock>
            <TextBox x:Name="txtName"></TextBox>
            <TextBlock Text="Sex"></TextBlock>
            <StackPanel Orientation="Horizontal">
                <RadioButton x:Name="rMale" GroupName="Sex" Content="Male"></RadioButton>
                <RadioButton x:Name="rFemale" GroupName="Sex" Content="Female"></RadioButton>
            </StackPanel>
            <TextBlock Text="Knowledge"></TextBlock>
            <StackPanel Orientation="Horizontal">
                <CheckBox x:Name="cbAsp" Content="ASP.NET" ></CheckBox>
                <CheckBox x:Name="cbSilverlight" Content="Silverlight"></CheckBox>
            </StackPanel>
        </StackPanel>
    </Grid>
</Grid>

<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton IconUri="/Images/ApplicationBar.Check.png" Text="Save" Click="ApplicationBarIconButton_Click"/>
        <shell:ApplicationBarIconButton IconUri="/Images/ApplicationBar.Cancel.png" Text="Cancel" Click="ApplicationBarIconButton_Click_1"/>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

Il codice

Grazie alla classe AppSettings che abbiamo creato, il codice di salvataggio e lettura dei settings da inserire nel code behind è molto più semplice: dato che abbiamo creato una proprietà per ogni settings, ci basterà

  • in fase di inizializzazione della pagina, associare ogni proprietà all’attributo del relativo controllo che ne definisce lo stato (quindi la proprietà NameSetting verrà associata all’attributo Text, la proprietà MaleSetting all’attributo IsChecked e così via).
  • quando viene premuto il pulsante di conferma, salvare lo stato del controllo nella relativa proprietà.

Ecco perciò il codice che andiamo ad inserire quando la pagina viene istanziata:

public SettingsWithConfirm()
{
    InitializeComponent();

    AppSettings settings = new AppSettings();
    //Name
    txtName.Text = settings.NameSetting;

    //Sex
    rMale.IsChecked = settings.MaleSetting;
    rFemale.IsChecked = settings.FemaleSetting;

    //Knowledge
    cbAsp.IsChecked = settings.AspNetSetting;
    cbSilverlight.IsChecked = settings.SilverlightSetting;
}

Questo invece è il codice che andiamo ad eseguire quando premiamo il pulsante Save nella Application Bar:

private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
    AppSettings settings=new AppSettings();
    
    //Name
    settings.NameSetting = txtName.Text;

    //Sex
    settings.MaleSetting = (bool) rMale.IsChecked;
    settings.FemaleSetting = (bool) rFemale.IsChecked;

    //Knowledge
    settings.AspNetSetting = (bool) cbAsp.IsChecked;
    settings.SilverlightSetting = (bool) cbSilverlight.IsChecked;

    NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}

Non si tratta sicuramente del codice più efficiente in assoluto, dato che stiamo implementando della logica relativa ai dati nel code behind: non è sbagliato, ma l’applicazione risultante sarà difficile da testare e da manuntenere nel tempo. E’ un codice però sicuramente più pulito ed elegante rispetto a quello visto nel primo post, dato che siamo comunque riusciti a demandare ad una classe esterna (AppSettings.cs) tutta la logica di salvataggio e caricamento dei settings.

Conclusione

Abbiamo visto una panoramica piuttosto approfondita di come gestire i settings della nostra applicazione usando la classe IsolatedStorageSettings: nel primo post abbiamo utilizzato una soluzione molto semplice, che ci ha permesso di famigliarizzare con il suo funzionamento. Nel post seguente, abbiamo implementato una soluzione più efficiente, che ci ha permesso di spostare la gestione dei settings in una classe esterna e di sfruttare il binding di Silverlight, così da salvare immediatamente qualsiasi modifica alle impostazioni. Infine, in questo terzo e ultimo post abbiamo usato la stessa architettura per implementare una soluzione ibrida: utilizziamo sempre una classe esterna, ma questa volta le impostazioni vengono salvate solo dopo aver premuto un pulsante di conferma.


Windows Phone , Microsoft , Isolated Storage

2 comments

Related Post


(will not be published)
(es: http://www.mysite.com)