Menu

A

|

A

Trucs et astuces Windows Phone 7

Voici mon premier article sur Windows Phone 7, je suis en train de décortiquer ce nouveau support et je vais donc maintenant vous exposer quelques fondamentaux biens utiles quand on développe sur cette plateforme.

Premièrement la navigation entre les pages de son projet. Il y a plusieurs façons de faire, je vais vous présenter celles qui seront les plus couramment utilisées.

Classe NavigationService

Dans les pages héritées de PhoneApplicationPage, il existe une propriété NavigationService qui permet de gérer cette transition à partir de la page courante et donc de conserver un historique de navigation. Dans le code behind de toute page, vous pouvez faire appel à la fonction Navigate(Uri) qui permet de passer à la page suivante.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // Appel a la fonction NavigationService.Navigate(Uri)
            this.NavigationService.Navigate(new Uri("/MonAutrePage.xaml"))
        }
    }
}

Il existe d’autres fonctions bien utiles, vous pouvez trouver le détail ici.

RootVisual et NavigationService

Si vous n’avez pas accès à votre page courante (notamment si vous êtes en MVVM) vous pouvez quand même accéder au NavigationService par le bié de la propriété Application.Current.RootVisual, qui vous donne la page en cours d’affichage. Un simple cast et un accès a sa propriété NavigationService vous permet de naviguer vers une autre page.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class UneClasse
    {
        // Constructeur de la page
        public UneClasse()
        {
            // Navigation a partir du RootVisual
            PhoneApplicationFrame root = Application.Current.RootVisual as PhoneApplicationFrame;

            if (root != null)
                root.Navigate(new Uri("/MonAutrePage.xaml"));
        }
    }
}

Il est a noter ici que l’on utilise les services de navigation de la Frame et non de la page, mais cela revient au même.

UriMapper

Il est possible de créer une table de navigation dans notre application Windows Phone 7, ce qui permet notamment de mieux stucturer ses Uri quand on veux faire appel au NavigationService, ou écrire les Uri dans les contrôles Silverlight a partir du XAML.
Pour utiliser cette technique il y a deux choses a faire. Premièrement, dans le fichier App.xaml, i lfaut déclarer dans la partie Resources notre table de navigation.

<Application xmlns:nav="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone">
    <Application.Resources>
        <nav:UriMapper x:Key="MonUriMapper">
           <nav:UriMapper.UriMappings>
                <nav:UriMapping Uri="/Root" MappedUri="/Default.xaml"/>
                <nav:UriMapping Uri="/Menu" MappedUri="/MonMenu.xaml"/>
                <nav:UriMapping Uri="/Liste/{numero}" MappedUri="/MesListes/Liste{numero}.xaml"/>
                <nav:UriMapping Uri="/Liste/{numero}/{param1}" MappedUri="/MesListes/Liste{numero}.xaml?id={param1}"/>
            </nav:UriMapper.UriMappings>
        </nav:UriMapper>
    </Application.Resources>
</Application>

Vous remarquez que l’on peut gérer des paramètres dans la table de navigation, cela se gère comme les tables de navigation Silverlight standard, là dessus aucune surprise, Windows Phone 7 reprend les mêmes éléments qu’une application Silverlight lambda.

Dernière étape, mettre cette table de navigation en ressource par défaut dans votre application Windows Phone 7. Pour cela, allez dans le fichier App.xaml.cs et localisez le constructeur et a la fin de celui-ci ajoutez ceci.

// ...
public partial class App: Application
{
    //...

    public App()
    {
        // ...

        // Affectation de la table de navigation
        this.RootFrame.UriMapper = this.Resources["MonUriMapper"] as UriMapper;
    }

    //...
}

Par la suite vous pouvez donc accéder a votre table de navigation juste en indiquant l’alias (dans l’attribut Uri) dans le chemin de navigation.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // Appel a la fonction NavigationService.Navigate(Uri)

            this.NavigationService.Navigate(new Uri("/Liste/1/24"))
        }
    }
}

Tous ces concepts de navigation, si bien utilisées, permettent a votre application Windows Phone 7 de construire un historique de navigation et donc de permettre quand l’utilisateur clique sur le bouton Back de bien revenir sur la page précédente.

Bouton Back

Justement le bouton Back, comment intercepter son utilisation si l’on veut passer outre son fonctionnement standard. De ce coté rien de plus simple, il existe sur toutes les pages qui héritent de PhoneApplicationPage, un événement sur lequel vous pouvez vous abonner : BackKeyPress.

Il faut le faire sur chaque page de façon indépendant, ce qui permet d’exécuter du code juste avant le traitement de ce click. Si vous voulez annuler le click si le bouton Back, rien de plus simple. Dans la fonction de CallBack de l’événement il vous suffit de renseigner dans le paramètre d’argument System.ComponentModel.CancelEventArgs, la propriété Cancel et la mettre a True.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // On se branche sur l'événement
            this.BackKeyPress += new EventHandler<System.ComponentModel.CancelEventArgs>(MaFonctionDeCallBack);
        }

        // Fonction de CallBack
        private void MaFonctionDeCallBack(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // J'annule le click
            e.Cancel= true;
        }
    }
}

Comme vous le voyez, il n’y a rien de plus simple, tout reste cohérent avec le Framework Silverlight classique.

Trucs et astuces Windows Phone 7

Voici mon premier article sur Windows Phone 7, je suis en train de décortiquer ce nouveau support et je vais donc maintenant vous exposer quelques fondamentaux biens utiles quand on développe sur cette plateforme.

Premièrement la navigation entre les pages de son projet. Il y a plusieurs façons de faire, je vais vous présenter celles qui seront les plus couramment utilisées.

Classe NavigationService

Dans les pages héritées de PhoneApplicationPage, il existe une propriété NavigationService qui permet de gérer cette transition à partir de la page courante et donc de conserver un historique de navigation. Dans le code behind de toute page, vous pouvez faire appel à la fonction Navigate(Uri) qui permet de passer à la page suivante.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // Appel a la fonction NavigationService.Navigate(Uri)
            this.NavigationService.Navigate(new Uri("/MonAutrePage.xaml"))
        }
    }
}

Il existe d’autres fonctions bien utiles, vous pouvez trouver le détail ici.

RootVisual et NavigationService

Si vous n’avez pas accès à votre page courante (notamment si vous êtes en MVVM) vous pouvez quand même accéder au NavigationService par le bié de la propriété Application.Current.RootVisual, qui vous donne la page en cours d’affichage. Un simple cast et un accès a sa propriété NavigationService vous permet de naviguer vers une autre page.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class UneClasse
    {
        // Constructeur de la page
        public UneClasse()
        {
            // Navigation a partir du RootVisual
            PhoneApplicationFrame root = Application.Current.RootVisual as PhoneApplicationFrame;

            if (root != null)
                root.Navigate(new Uri("/MonAutrePage.xaml"));
        }
    }
}

Il est a noter ici que l’on utilise les services de navigation de la Frame et non de la page, mais cela revient au même.

UriMapper

Il est possible de créer une table de navigation dans notre application Windows Phone 7, ce qui permet notamment de mieux stucturer ses Uri quand on veux faire appel au NavigationService, ou écrire les Uri dans les contrôles Silverlight a partir du XAML.
Pour utiliser cette technique il y a deux choses a faire. Premièrement, dans le fichier App.xaml, i lfaut déclarer dans la partie Resources notre table de navigation.

<Application xmlns:nav="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone">
    <Application.Resources>
        <nav:UriMapper x:Key="MonUriMapper">
           <nav:UriMapper.UriMappings>
                <nav:UriMapping Uri="/Root" MappedUri="/Default.xaml"/>
                <nav:UriMapping Uri="/Menu" MappedUri="/MonMenu.xaml"/>
                <nav:UriMapping Uri="/Liste/{numero}" MappedUri="/MesListes/Liste{numero}.xaml"/>
                <nav:UriMapping Uri="/Liste/{numero}/{param1}" MappedUri="/MesListes/Liste{numero}.xaml?id={param1}"/>
            </nav:UriMapper.UriMappings>
        </nav:UriMapper>
    </Application.Resources>
</Application>

Vous remarquez que l’on peut gérer des paramètres dans la table de navigation, cela se gère comme les tables de navigation Silverlight standard, là dessus aucune surprise, Windows Phone 7 reprend les mêmes éléments qu’une application Silverlight lambda.

Dernière étape, mettre cette table de navigation en ressource par défaut dans votre application Windows Phone 7. Pour cela, allez dans le fichier App.xaml.cs et localisez le constructeur et a la fin de celui-ci ajoutez ceci.

// ...
public partial class App: Application
{
    //...

    public App()
    {
        // ...

        // Affectation de la table de navigation
        this.RootFrame.UriMapper = this.Resources["MonUriMapper"] as UriMapper;
    }

    //...
}

Par la suite vous pouvez donc accéder a votre table de navigation juste en indiquant l’alias (dans l’attribut Uri) dans le chemin de navigation.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // Appel a la fonction NavigationService.Navigate(Uri)

            this.NavigationService.Navigate(new Uri("/Liste/1/24"))
        }
    }
}

Tous ces concepts de navigation, si bien utilisées, permettent a votre application Windows Phone 7 de construire un historique de navigation et donc de permettre quand l’utilisateur clique sur le bouton Back de bien revenir sur la page précédente.

Bouton Back

Justement le bouton Back, comment intercepter son utilisation si l’on veut passer outre son fonctionnement standard. De ce coté rien de plus simple, il existe sur toutes les pages qui héritent de PhoneApplicationPage, un événement sur lequel vous pouvez vous abonner : BackKeyPress.

Il faut le faire sur chaque page de façon indépendant, ce qui permet d’exécuter du code juste avant le traitement de ce click. Si vous voulez annuler le click si le bouton Back, rien de plus simple. Dans la fonction de CallBack de l’événement il vous suffit de renseigner dans le paramètre d’argument System.ComponentModel.CancelEventArgs, la propriété Cancel et la mettre a True.

using System;
using Microsoft.Phone.Controls;

namespace MonApplicationWP7
{
    public class MaPageWP7: PhoneApplicationPage
    {
        // Constructeur de la page
        public MaPageWP7()
        {
            // On se branche sur l'événement
            this.BackKeyPress += new EventHandler<System.ComponentModel.CancelEventArgs>(MaFonctionDeCallBack);
        }

        // Fonction de CallBack
        private void MaFonctionDeCallBack(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // J'annule le click
            e.Cancel= true;
        }
    }
}

Comme vous le voyez, il n’y a rien de plus simple, tout reste cohérent avec le Framework Silverlight classique.

No Comments

Comments Are Closed