Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Windows 8 e WinRT: implementare il Settings contract

Come sapete, in Windows 8 è disponibile la barra dei c.d. "charm" che attivate scorrendo col dito (o col mouse) dal lato destro dello schermo verso il centro. La barra dei charm offre funzionalità di ricerca, condivisione, impostazioni, scorciatoie a funzioni di sistema.

Il ruolo dei charm è fondamentale, perché non solo lavorano con Windows ma si integrano con le app per cui queste possono sfruttare (attraverso i contracts) i charm stessi per cercare, condividere, impostare settings su sé stesse.

In questo post vedremo come implementare il Settings Contract e dotare un'app per Windows 8 della possibilità di prevedere impostazioni e fornire informazioni.

Per interagire con il charm dei settings si ricorre al namespace Windows.UI.ApplicationSettings. La prima cosa da fare è ottenere la visualizzazione corrente dell'app associata alla barra dei settings. Al caricamento della pagina principale dell'app utilizzeremo quindi il metodo GetForCurrentView della classe SettingsPane e in particolare ci metteremo "in ascolto" dell'evento CommandsRequested, che viene scatenato quando l'utente attiva il settings charm:

    Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

        AddHandler SettingsPane.GetForCurrentView.CommandsRequested, AddressOf OnCommandRequested

    End Sub

Prima di proseguire, facciamo una considerazione: perché dobbiamo implementare i settings? Indubbiamente può essere utile per memorizzare le preferenze dell'utente, che tendenzialmente andranno memorizzate in variabili poi serializzate nell'isolated storage. Ma i motivi fondamentali sono fondamentalmente due: in primo luogo perché l'app deve sempre offrire il modo di contattare il supporto tecnico e in secondo luogo perché, se fa uso di Internet, l'app deve mostrare la privacy policy; entrambe le cose si fanno nei settings. Ciò premesso, focalizziamo l'attenzione proprio su questi due aspetti piuttosto che vedere come memorizzare preferenze utente. Ciascuna voce che compare nel settings charm corrisponde a un'istanza della classe SettingsCommand, pertanto nel gestore dell'evento CommandsRequested definiremo due comandi, per le necessità di cui sopra. Ecco un esempio:

    Private Sub OnCommandRequested(sender As SettingsPane, args As SettingsPaneCommandsRequestedEventArgs)

        args.Request.ApplicationCommands.Clear()

        Dim privacyInfo As New SettingsCommand("privComm", "Privacy", Sub()

                                                                          ShowSettingsPanel()

                                                                      End Sub)

 

        Dim supportInfo As New SettingsCommand("suppComm", "Supporto", Async Sub()

                                                                           Await ShowSupportPanel()

                                                                       End Sub)

        args.Request.ApplicationCommands.Add(privacyInfo)

        args.Request.ApplicationCommands.Add(supportInfo)

    End Sub

Il costruttore di questa classe vuole un identificatore per il comando, il testo da visualizzare e un delegate che faccia qualcosa. Nel primo caso andremo ad aprire un apposito pannello, che implementeremo tra breve. Nel secondo caso lanceremo il client di posta predefinito, attività asincrona che vuole un Await. Entrambi i comandi confluiscono poi in una collezione di comandi chiamata ApplicationCommands.

Prima di tutto la cosa più facile, ossia un metodo asincrono che avvii il client di posta predefinito per inviare una mail al supporto tecnico:

    Private Async Function ShowSupportPanel() As Task

        Await Windows.System.Launcher.LaunchUriAsync(New Uri("mailto:supporto[@]visual-basic.it?subject=Aiutatemi", UriKind.Absolute))

    End Function

 Attraverso il metodo Windows.System.Launcher.LaunchUriAsync si può aprire un Url con il programma predefinito. Poi la parte difficile, ossia il pannello per mostrare la privacy policy. Per fare questo, così come per mostrare controlli all'utente per permettere di decidere le impostazioni, ci vuole uno user control. Ne creiamo uno chiamato AppSettings.xaml. Il codice è davvero banale, usiamo il pulsante Back predefinito e mostriamo un messaggio di testo che riassuma la nostra policy:

   <Border BorderBrush="Black" BorderThickness="2" Background="White">

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="90"/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <Grid Grid.Row="0" Background="DarkGray">
                <Grid Margin="40,40, 0,0">
                    <Grid.Transitions>
                        <TransitionCollection>
                            <EntranceThemeTransition FromHorizontalOffset="50" />
                        </TransitionCollection>
                    </Grid.Transitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="50" />
                        <ColumnDefinition Width="2*" />
                    </Grid.ColumnDefinitions>
                    <Button Click="SettingsBack_Clicked"
                            Margin="0"
                            Grid.Column="0"
                            Style="{StaticResource BackButtonStyle}"
                            HorizontalAlignment="Left" />
                    <TextBlock Margin="10,4,0,0"
                               Grid.Column="1"
                               FontSize="28"
                               Text="Privacy policy"
                               HorizontalAlignment="Left" />
                </Grid>
            </Grid>

            <TextBlock Margin="40,20,0,0" Grid.Row="1" FontSize="20" Text="VB T&amp;T rispetta la tua privacy.
                       La connessione a Internet è richiesta solo per sfogliare i contenuti e
                       leggere i feed RSS ma nessuna informazione personale viene raccolta."
                   Foreground="Navy" TextWrapping="Wrap" />
        </Grid>
    </Border>

Nel chiudere il riquadro, il gestore del pulsante tratta il pannello come un popup e lo chiude:

    Private Sub SettingsBack_Clicked(sender As Object, e As RoutedEventArgs)

        Dim pop As Popup = CType(Me.Parent, Popup)

        If pop IsNot Nothing Then

            pop.IsOpen = False

        End If

    End Sub

Tornando alla pagina principale, non resta che implementare il delegate che invocherà il pannello in questo modo:

    Private _settingsPopup As Popup

    Private _settingsWidth As Double = 346

 

    Private Sub ShowSettingsPanel()

        Dim windowBounds As Rect = Window.Current.Bounds

 

        _settingsPopup = New Popup With { _

            .IsLightDismissEnabled = True, _

            .Width = _settingsWidth, _

            .Height = windowBounds.Height _

        }

        _settingsPopup.SetValue(Canvas.LeftProperty, windowBounds.Width - _settingsWidth)

        _settingsPopup.SetValue(Canvas.TopProperty, 0)

 

        Dim appSettingsPane As New AppSettings With { _

            .Width = _settingsWidth, _

            .Height = windowBounds.Height}

 

        _settingsPopup.Child = appSettingsPane

 

        _settingsPopup.IsOpen = True

    End Sub

 Il codice crea un popup delle dimensioni riferibili all'area prevista correntemente dal sistema, impostando gli angoli top e left. L'istanza del controllo utente è poi associata al popup, che viene così visualizzato.

Quando l'app è in esecuzione, il lavoro sopra svolto è visibile in due fasi. La prima all'apertura del settings charm:

La seconda quando attiviamo il comando della privacy:

Ovviamente potete anche sperimentare il comando del supporto.

Alessandro

Print | posted on mercoledì 12 settembre 2012 00:43 | Filed Under [ Visual Basic UWP e Windows Store Apps Visual Studio 2012 ]

Powered by:
Powered By Subtext Powered By ASP.NET