Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[WP7] Mise à jour des outils de dev

Une nouvelle version des outils de dev WP7 sont disponible :

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=49b9d0c5-6597-4313-912a-f0cca9c7d277&displaylang=en

Les nouveautés sont:

  • Windows Phone Capability Detection Tool – Detects the phone capabilities used by your application. When you submit your application to Windows Phone Marketplace , Microsoft performs a code analysis to detect the phone capabilities required by your application and then replaces the list of capabilities in the application manifest with the result of this detection process. This tool performs the same detection process and allows you to test your application using the same list of phone capabilities generated during the certification process.
  • Windows Phone Connect Tool – Allows you to connect your phone to a PC when Zune® software is not running and debug applications that use media APIs.
  • Updated Bing Maps Silverlight Control – Includes improvements to gesture performance when using Bing™ Maps Silverlight® Control.
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

J’ai craqué…

… je me suis inscrit sur facebook…

Posté le par Nicolas | 3 commentaire(s)
Classé sous :

Warnygo, dernière ligne droite

Bonjour à tous !

 

Je vous rappelle que Warnygo participe à une compétition organisée par Microsoft pour les développeurs d’applications mobiles pour Windows Phone 7. Nous avons besoin de vous et il ne reste que quelques jours.

Pour nous aider à gagner, c’est très simple, il vous suffit de:

1.       1: Cliquer ici et “aimer” la page Developpeurs de Microsoft (nécessaire pour pouvoir ensuite soutenir l’application Warnygo)

 

 

2.        2: Puis cliquez ici et “aimez” la vidéo de présentation de Warnygo sur Windows Phone 7 !

 

 

Votre vote a bien été comptabilisé si votre nom apparait.

Si nous obtenons suffisamment de “J’aime” et que Warnygo arrive parmi les 7 premiers, nous participerons à la grande finale du concours le 7 Octobre, et notre jeu sera présenté à un jury d’entrepreneurs autour de Steve Ballmer, CEO de Microsoft.

Alors plus une seconde à perdre, cliquez sur “J’aime” et invitez tous vos amis à nous aider également !

 

Merci à tous !

Posté le par Nicolas | 1 commentaire(s)
Classé sous : , ,

[WP7] Besoin d’avoir des données en cache

Les développeurs ASP.NET ont l’habitude de mettre des données en cache pour éviter de requêter a chaque fois la base de données. Et il est toujours utilie de penser que vos utilisateurs mobiles n’ont pas troujours une super connexion 3G/WIFI et un forfait ilimité. Il est donc utile de mettre des données en cache, lors d’un développement WP7, le reflexe à avoir pour ajouter de la persitence à des données est l’isolatedstorage.

Si comme en ASP.NET, vous souhaitez ajouter une expiration, c’est a dire que l’objet n’est disponible que pendant une certaine durée, vous devez passer par du code spécifique, il est n’est pas possible de le faire en standard.

Pour réaliser cette fonctionnalité, il faut développer un wrapper, donc voici les étapes de code:

La première etape est de créer une classe Cache qui contient un singleton, il contient également les valeurs pour NoAbsoluteExpiration et NoSlidingExpiration.

    public class Cache
    {
        public static readonly DateTime NoAbsoluteExpiration = DateTime.MaxValue;
        public static readonly TimeSpan NoSlidingExpiration = TimeSpan.Zero;

// Accès à l'isolatedstorage
        readonly IsolatedStorageFile _myStore = IsolatedStorageFile.GetUserStoreForApplication();

// singleton
        private static Cache _current;
        public static Cache Current
        {
            get { return _current ?? (_current = new Cache()); }
        }

Comme l’api ASP.NET le propose, nous ajoutons une méthode pour ajouter un objet au cache et définir les expirations.

Un objet en cache est défini par une clef (pour le retrouver),  l’objet en lui même qui sera sérialisé et les éléments d’expiration.

/// <summary>
/// Adds the specified key.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="value">The value.</param>
/// <param name="absoluteExpiration">The absolute expiration.</param>
/// <param name="slidingExpiration">The sliding expiration.</param>
public void Add(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
    lock (_sync)
    {
        if (Contains(key))
            Remove(key);

        if (absoluteExpiration == NoAbsoluteExpiration)
            Add(key, DateTime.UtcNow + slidingExpiration, value);
        if (slidingExpiration == NoSlidingExpiration)
            Add(key, absoluteExpiration, value);
    }
}

Puis nous ajoutons concrètement l’objet dans l’isolated storage.

Pour chaque key, un répertoire avec son nom est créé, puis dans ce répertoire est créé un fichier nommer avec la date d’expiration au format Windows file time UTC (Une heure de fichier Windows est une valeur 64 bits qui représente le nombre d'intervalles de 100 nanosecondes qui se sont écoulés depuis 12:00 minuit, le 1er janvier 1601 après Jésus-Christ(notre ère) en temps universel coordonné (UTC)).

 

/// <summary>
/// Adds the specified key.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="expirationDate">The expiration date.</param>
/// <param name="value">The value.</param>
private void Add(string key, DateTime expirationDate, object value)
{
    lock (_sync)
    {
        if (!_myStore.DirectoryExists(key))
            _myStore.CreateDirectory(key);
        else
        {
	// Si la key existe déja, on supprime le répertoire et le fichier
            string currentFile = _myStore.GetFileNames(string.Format("{0}\\*.cache", key).FirstOrDefault();
            if (currentFile != null)
                _myStore.DeleteFile(string.Format("{0}\\{1}", key, currentFile));
            _myStore.DeleteDirectory(key);
            _myStore.CreateDirectory(key);
        }

        string fileName = string.Format("{0}\\{1}.cache", key, expirationDate.ToFileTimeUtc());


        if (_myStore.FileExists(fileName))
            _myStore.DeleteFile(fileName);

      using (var isolatedStorageFileStream = new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, _myStore))
         {
           DataContractSerializer s = new DataContractSerializer(value.GetType());
           s.WriteObject(isolatedStorageFileStream, value);
         }
    }
}

Puis la dernière étape est de recuperer la valeur dans le cache, si le cache a expiré, la méthode retourne null.

/// <summary>
/// Gets the specified key.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">The key.</param>
/// <returns></returns>
public T Get<T>(string key)
{
    lock (_sync)
    {
// Récuperation du fichier
        string currentFile =  _myStore.GetFileNames(string.Format("{0}\\*.cache", key).FirstOrDefault();
        if (currentFile != null)
        {
// verification si le cache n'a pas expiré
            var expirationDate =
                DateTime.FromFileTimeUtc(long.Parse(Path.GetFileNameWithoutExtension(currentFile)));
            if (expirationDate >= DateTime.UtcNow)
            {
// Deserialisation de l'objet
                using (var isolatedStorageFileStream = new IsolatedStorageFileStream(
string.Format(@"{0}\{1}", key, currentFile), FileMode.Open, _myStore))
                {
                    DataContractSerializer s = new DataContractSerializer(typeof(T));
                    var value = s.ReadObject(isolatedStorageFileStream);
                    isolatedStorageFileStream.Close();
                    return (T)value;
                }
            }
// Si la date d'expiration est dépassé, on supprime le fichier de l'isolatedstorage
            Remove(key);
        }
        return default(T);
    }
}

Maintenant que nous avons les bases d’un sytème de cache, voici comment nous pouvons l’utiliser facilement et en y mettans un peut de Rx dans tout ca. Dans cette exemple, nous avons une methode GetAll qui renvoie des données depuis un service WCF. Le MyServiceClient a été généré par Visual Studio.

public void GetAll(Action<ObservableCollection<MyEntity>> callback)
{
    // Verification si l'objet est en cache et n'a pas expiré
    if (Cache.Current.Contains("KEY1"))
    {
        // Lecture du cache dans un nouveau thread, et appel du callback dans le dispatcher thread
        Observable.Start(() =>
                            Cache.Current.Get<ObservableCollection<MyEntity>>("KEY1"), Scheduler.ThreadPool).
            ObserveOn(Scheduler.Dispatcher).Subscribe(callback);
        return;
    }
    // Création du client pour le service WCF
    MyServiceClient client = new MyServiceClient();
    Observable.FromEvent<GetAllCompletedEventArgs>(client, "GetAllCompleted")
            .ObserveOn(Scheduler.ThreadPool)
            .Select(s =>
            {
                // Dans un nouveau thread, on ajoute l'objet recu par WCF dans le cache,
                	//sa durée de vie est de 1 jour
                if (s.EventArgs.Error == null)
                {
                    Cache.Current.Add("KEY1", s.EventArgs.Result, Cache.NoAbsoluteExpiration, TimeSpan.FromDays(1));
                }
                return s;
            })
        .ObserveOn(Scheduler.Dispatcher).Subscribe(s =>
        {
            // Puis dans le dispatcher thread, on appel le callback
            callback(s.EventArgs.Result);
        });
    // Appel de la méthode WCF
    client.GetAllAsync();
}

Si vous n’avez que des “settings” à sauvegarder, je vous conseil d’utiliser les API standard:

IsolatedStorageSettings.ApplicationSettings.Add("key", value);
IsolatedStorageSettings.ApplicationSettings.Save();

Ce code est utilisé pour le projet Warnygo, et est bien sur disponible au complet: Phone7.Fx.Preview.zip

Si vous avez des retours, n’hésitez pas !

Posté le par Nicolas | 1 commentaire(s)
Classé sous : ,

Votez pour Warnygo

image

La vidéo du projet Warnygo est disponible sur facebook et attend vos votes !

Pour rappel:

Warnygo est une application Windows Phone 7 qui permet d’alerter tous utilisateurs inscrits qui se trouve dans la zone où se passe l’évenement. Tous les sujets d’alerte sont possibles, un site Web permet d’en rajouter.

Malheureusement, Facebook a eu des problèmes dernièrement, donc voici la procédure pour voter:

image

La vidéo est disponible sur la page du concours: http://www.facebook.com/video/video.php?v=465703466010

On compte sur vous !

 

PS: Pourquoi MS a organisé le concours sur Facebook ?!?

Posté le par Nicolas | 2 commentaire(s)

[WP7] Windows Phone Developer Tools RTM, c’est pour le 16 septembre

Comme l’annonce la Team WP7, la version finale des tools sera dispo le 16 septembre 2010. Les controls Panorama, pivot et Bing Maps seront inclus dans cette release.

 

Source: http://windowsteamblog.com/windows_phone/b/wpdev/

Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Comment avoir une applicationbar bindable ?

L’API Windows Phone 7 permet d’afficher une barre de menu standard dans vos applications. Malheureusement, il n'est pas possible de faire du binding dessus, car l'object n'est pas un FrameworkElements, mais pourquoi ? Voici la réponse de Peter Torrs:

Firstly, the ApplicationBar is not a Silverlight element and thus not all Silverlight concepts apply to it. For example, you would expect that the Background could be set to any kind of brush - SolidColorBrush, LinearGradientBrush, and so on - but because the AppBar is actually rendered by the Windows Phone shell, it only supports a solid colour. You might also expect to be able to put arbitrary Content inside the buttons, or to apply RenderTransforms to the menu items, and so on. And you should be able to put it anywhere on the screen with HorizontalAlignment / VerticalAlignment, right? Again, none of these things are supported by the underlying shell UX, so they would all have to throw exceptions or no-op when called. And where's the fun in that?

Secondly, the content models in Silverlight 3 do not support controls with multiple collections of items. Some of the built-in elements have multiple collections - for example, Grid has the Children collection in addition to the RowDefinitions and ColumnDefinitions collections - but these are not actually usable outside of the "core" (they rely on PresentationFrameworkCollection, which is an internal class, and in order to maintain portability across platforms we are not adding anything phone-specific to the "core"). For the AppBar, we want both a Buttons collection and a MenuItems collection, and that's just not doable in a clean, strongly-typed API (there are hacks, such as making the AppBar a generic container and then hoping that developers only put buttons and menu items into it, but they're not good design). Silverlight 4 has addressed this limitation with the DependencyObjectCollection class, but Windows Phone is based on version 3, not 4.

Pour résumer, l’applicationBar n’est pas un objet SilverLight…voila qui est bien embêtant…

Pour répondre au besoin de binding, j’ai développé un wrapper qui le permet, il est ainsi possible d’associer des commandes sur le click d’un bouton et ainsi de respecter les patterns MVVM.

Son utilisation est très simple, prenons l’exemple d’un bouton et d’un item de menu:

<Controls:BindableApplicationBar x:Name="AppBar" BarOpacity="1.0" IsVisible="{Binding IsBarVisible}" >
  <Controls:BindableApplicationBarIconButton Command="{Binding AddCommand}" Text="Add" IconUri="/images/appbar.add.rest.png" />
  <Controls:BindableApplicationBar.MenuItems>
    <Controls:BindableApplicationBarMenuItem  Text="Settings" Command="{Binding SettingsCommand}" />
  </Controls:BindableApplicationBar.MenuItems>
</Controls:BindableApplicationBar>

Regardons maintenant les rouages du wrapper. Le wrapper est un control héritant de ItemsControl et implémentant l’interface standard IApplicationBar. Je l’ai nommé BindableApplicationBar.

[ContentProperty("Buttons")]
public class BindableApplicationBar : ItemsControl, IApplicationBar
{
    // ApplicationBar wrappé
    private readonly ApplicationBar _applicationBar;

    public BindableApplicationBar()
    {
        _applicationBar = new ApplicationBar();
        this.Loaded += BindableApplicationBar_Loaded;
    }

    void BindableApplicationBar_Loaded(object sender, RoutedEventArgs e)
    {
        // AU chargement du control, on recherche la page ou est situé le control pour lui associé notre applicationbar
        var page =
            this.GetVisualAncestors().Where(c => c is PhoneApplicationPage).FirstOrDefault() as PhoneApplicationPage;
        if (page != null) page.ApplicationBar = _applicationBar;
    }
...

L’étape suivant est d’ajouter les boutons et menuItems XAML à l’applicationbar wrappé.

protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    base.OnItemsChanged(e);
    // On efface tout, pour être sur...
    _applicationBar.Buttons.Clear();
    _applicationBar.MenuItems.Clear();
    // On récupère tous les boutons défini dans les items de l'ItemsControl
    foreach (BindableApplicationBarIconButton button in Items.Where(c => c is BindableApplicationBarIconButton))
    {
        // on les affectes a l'application bar
        _applicationBar.Buttons.Add(button.Button);
    }
    foreach (BindableApplicationBarMenuItem button in Items.Where(c => c is BindableApplicationBarMenuItem))
    {
        _applicationBar.MenuItems.Add(button.MenuItem);
    }
}

Ensuite, pour que le binding soit effectif, il suffit de rajouter les DependencyProperty.

public static readonly DependencyProperty IsVisibleProperty =
    DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(BindableApplicationBar), new PropertyMetadata(true, OnVisibleChanged));

private static void OnVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (e.NewValue != e.OldValue)
    {
        ((BindableApplicationBar) d)._applicationBar.IsVisible = (bool) e.NewValue;
    }
}

public bool IsVisible
{
    get { return (bool)GetValue(IsVisibleProperty); }
    set { SetValue(IsVisibleProperty, value); }
}

Le mécanisme du wrapper est plus ou moins identique pour BindableApplicationBarIconButton et BindableApplicationBarMenuItem.

Le binding peut ainsi s’effectuer sur les propriétés (Visible, Text, …), et sur les commands et commandparameter ! Je précise que le binding sur la propriété text est très pratique dans le cas d’une application multilingue. On peut ainsi appliqué du binding sur des fichiers de resources, comme expliqué dans cet article MSDN :http://msdn.microsoft.com/en-us/library/ff637520%28VS.92%29.aspx

Ce code est utilisé pour le projet Warnygo, et est bien sur disponible : Phone7.Fx.Preview.zip

Si vous avez des retours, n’hésitez pas !

Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

Warnygo.com arrive !!!

image

Après des jours de travail acharnées, je vous annonce que notre projet Warnygo.com participera au concours WP7.

Une vidéo complète sera bientôt disponible sur la page Facebook, mais en attendant, je vous laisse découvrir nos derniers teasers disponibles en exclu sur le site du projet (http://www.warnygo.com), soyez prêt d’autres vidéos suivrons…

Je compte sur vous pour nous supporter à travers vos votes facebook.

Posté le par Nicolas | 0 commentaire(s)
Classé sous : , ,

Packs d’icones

Un petit post pour partager un site proposant des packs d’icones que j’ai trouvé ce matin. http://icons.mysitemyway.com/ propose des packs vraiments sympas et sans royalties !

image

Si vous avez d’autres sites d’icones sympas en stock, merci de les partager dans les commentaires Smile

Posté le par Nicolas | 2 commentaire(s)
Classé sous :

IPhone versus WP7 Coding

Je relais une présentation sur slideshare.net, qui compare le développement sur Iphone et Windows Phone 7, qui ma fait sourire.

J'aurais bien aimé une comparaison en ajoutant android...

Posté le par Nicolas | 2 commentaire(s)
Classé sous : ,

[WP7] Comment savoir si notre code est exécuté dans l'émulateur ou sur un device

Les APIs permettent de détecter si notre application Windows Phone 7 est exécuté dans l’émulateur ou dans un vrai téléphone physique.

Pour cela, il suffit d’ajouter en référence la dll Microsoft.Phone (Microsoft.Phone, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e) à votre projet et d’utiliser le code suivant:

 

if (Microsoft.Devices.Environment.DeviceType == DeviceType.Device)
{
    // je suis dans un device
}
if (Microsoft.Devices.Environment.DeviceType == DeviceType.Emulator)
{
    // je suis dans l'emulateur
}
Et voila, tout simple non ?
Posté le par Nicolas | 1 commentaire(s)
Classé sous : ,

[WP7] UI Design and Interaction Guide for Windows Phone 7 v2.0 & Design Templates for Windows Phone 7

UI-design-2

Microsoft a mis à jour le guide UI Design and Interaction Guide for Windows Phone 7 v2.0 pour la version beta des outils. On ne peut pas dire que c’est une mise à jour mineur, car il y a tout de meme 101 pages dans le pdf !

Le guide est disponible ici: http://go.microsoft.com/fwlink/?LinkID=183218

On a égualement la mise à jour du Design Templates for Windows Phone 7.

Il est disponible ici: http://go.microsoft.com/fwlink/?LinkId=196225

Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] PRISM / Composite Application for Silverlight pour WP7 disponible pour la version Beta du SDK

Je viens de mettre à jour mon port de prism pour WP7 pour la version Beta de juillet du SDK

Pour rappel, les fonctionnalités sont:

  • IOC Container & DP injection basé sur http://ioc.codeplex.com/
  • Region / Child region et RegionManager
  • Event Aggregator
  • MVVM
  • Commands
  • Transition & Animation
  • Back button
  • Module loading

C'est par là que ca se passe: http://phone7.codeplex.com
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Windows Phone Developer Tools Beta de juillet est disponible !!!

Un petit post en reatrd de 24 heures pour indiquer à ceux qui ne sont pas ou pas encore en vacances que la nouvelle version des outils de développement pour Windows Phone 7 est disponible !

Pour télécharger tout ca c’est ici: http://www.microsoft.com/downloads/details.aspx?FamilyID=c8496c2a-54d9-4b11-9491-a1bfaf32f2e3&displaylang=en

Pour connaitre les nouveautés et les changements, c’est ici que ca se passe:http://msdn.microsoft.com/en-us/library/ff637516%28VS.92%29.aspx

Bon download et bonne mise à jour de vos applications...

Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Ajouter un peu de physique dans vos applications…

Pour les démonstrations des MsDays organisé par Exakis à Lyon, nous avons développé une application SilverLight sur le thème de l'Olympique Lyonnais. Si vous étiez présent à la session, vous avez pu voir ma démo avec les joueurs de l'OL sur un terrain et animés grâce à l'accéléromètre et associé à un moteur physique. En effet, suivant l’inclinaison du téléphone, chaque joueurs tombaient sur les bordures du terrain et s'entrechoquais l'un l'autre.

PICT1682 PICT1684

Le développement de cette fonctionnalité fut très simple et rapide. La première étape fut d'appeler les api qui permettent de récupérer les données de l'accéléromètre via la références à "Microsoft.Devices.Sensors".
Pour cela, l'exemple fournit par msdn est très clair (http://msdn.microsoft.com/en-us/library/ff637521%28VS.92%29.aspx).
L'exemple utilise la dernière innovation des DevLabs Microsoft, j'ai nommée Reactive Extensions for .NET ou Rx. (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) , pour émuler des données.

Rx est une bibliothèque pour composer des programmes asynchrones et basée sur des événements à l'aide des observable collections. Rx est un sur-ensemble des opérateurs LINQ standard qui expose des calculs asynchrones et basées sur des événements comme des collections observables, la transmission via les nouvelles interfaces .NET 4.0 IObservable et IObserver . Pour voir des exemples concrets de Rx, je vous invite à consulter: http://rxwiki.wikidot.com/101samples.

Pendant mon développement, je n'avais pas accès à un vrai device WP7, et le seul accéléromètre que j'avais à la maison étais ma manette wiimote. Comme le monde est bien fait Smile, il existe une api .net sur codeplex (http://wiimotelib.codeplex.com) qui permet de lire les données envoyer par la manette via bluetooth. Pour faire communiquer la manette et l’émulateur, la seul solution est de passer simplement par l’intermédiaire d’un serveur HTTP et d’utiliser un HttpListenerContext. Le serveur reçoit les données de la Wiimote, puis attend une requête avant de renvoyer les coordonnées x,y,z. Coté phone, il suffit de faire les appels vers le serveur HTTP local avec WebClient et de reconstruire un object vecteur grâce aux coordonnées. Dans ce cas, Rx nous aide à jouer avec les évènements...

var wiimote = new Wiimote();
wiimote.Connect();
wiimote.SetReportType(InputReport.IRAccel, true);
wiimote.SetLEDs(true, false, false, false);

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:12345/");
listener.Start();

Console.WriteLine("Wiimote and server are ready !");

wiimote.WiimoteChanged += (o, a) =>
{
        HttpListenerContext context = listener.GetContext();
        using (StreamWriter w = new StreamWriter(context.Response.OutputStream))
        {
            var p = a.WiimoteState.AccelState.Values;
            w.Write(string.Format("{0}:{1}:{2}", p.X, p.Y, p.Z));
            Console.WriteLine(string.Format("X={0} Y={1} Z={2}", p.X, p.Y, p.Z));
        }
        context.Response.Close();
        Thread.Sleep(50);
};
Maintenant que nous avons le vecteur de l'accéléromètre (le vrai ou celui de la wiimote), il est temps de mettre un peu de physique dans tout ça !
Pour cela, j’ai utilisé les extensions Farseer pour silverlight. Andy Beaulieu a effectué un super travail, ça librairie est très simple d’utilisation. Il suffit de mettre un canvas principal, 4 rectangles pour délimiter le terrain et 11 images pour les joueurs puis d’ajouter les behaviors correspondants:
<canvas x:name="mainCanvas">
<i:interaction.behaviors>
 <pb:physicscontrollerbehavior mousepickenabled="True" debugmode="False" />
</i:interaction.behaviors>
<img cachemode="BitmapCache" source="ol.png" canvas.left="214" canvas.top="12" />  <i:interaction.behaviors>
  <pb:physicsobjectbehavior />
 </i:interaction.behaviors>
</img>
<rectangle cachemode="BitmapCache" canvas.left="471" canvas.top="0" fill="Transparent" height="800" width="8">
 <i:interaction.behaviors>
  <pb:physicsobjectbehavior isstatic="True" />
 </i:interaction.behaviors>
 </rectangle>

Ensuite, il ne reste plus qu'a mettre la gravité à chaque évènenement reçu de l'accéléromètre sur le canvas principal :
public void SetGravity(int x, int y)
{
 var physicsControllerMain = mainCanvas.GetValue(PhysicsControllerMain.PhysicsControllerProperty) as PhysicsControllerMain;
 physicsControllerMain.Simulator.Gravity.X = x;
 physicsControllerMain.Simulator.Gravity.Y = -y;
}

Et voilà :), le tour est joué ! Le meilleur dans l'histoire, c'est que mon code était à 100% fonctionnel sur l’émulateur et sur le vrai téléphone.
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] PRISM / Composite Application for Silverlight pour WP7 –> phone7.codeplex.com

Je l’avais annoncé il y a quelques temps, je viens, enfin, de mettre sur codeplex un port de PRISM pour WP7. Vous pourrez développer des applications composites sous forme de module en silverlight pour Windows Phone.

Les fonctionnalités sont:

  • IOC Container & DP injection basé sur http://ioc.codeplex.com/
  • Region / Child region et RegionManager
  • Event Aggregator
  • MVVM
  • Commands
  • Transition & Animation
  • Back button
  • Module loading
Une application d'exemple est fournis, mais elle est relativement simple, j'espere rapidement la rendre beaucoup plus complete. J'attends vos retours !!!
http://phone7.codeplex.com
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Composants Infragistics pour Windows Phone

Juste un petit post pour annoncer qu’Infragistics travail sur une suite de composants silverlight pout WP7.
Une première maquette ,IGFinance, est déja disponible avec les sources.

http://www.infragistics.com/innovations/mobile-app-igfinance.aspx#MobileAppIGFinance

Infragistics IGFinance is a mobile application in action enabling end users to visualize and manipulate views of their stock portfolio. Using the re-designed, touch-enabled xamWebDataChart™ a Silverlight chart designed for handling high volumes of data ranging into the millions of data points-users can select a stock, 'pull down' to add it into their stock bin, 'trace' over the vertical chart to view the stock value over a period of time, rotate the mobile device and view a Windows 7 color-schemed comparison overlay of all stocks in their stock bin.
Posté le par Nicolas | 2 commentaire(s)
Classé sous : ,

[WP7] Performance de vos applications Silverlight

L’émulateur Windows Phone 7 se comporte comme une machine virtuelle, pour tirer profit de votre PC, n’oublier pas d’activer dans le bios, la prise en charge de la virtualisation par votre processeur.

De plus il peut utiliser la puissance de votre carte graphique, cela augmente grandement les performances... Pour être sur que votre GPU est compatible, il faut qu'il supporte WDDM 1.1 et DirectX 10. Pour vérifier cela, il faut:

  1. Depuis le menu Démarrer, faite Executer
  2. Executer dxdiag
  3. Vérifier dans l'onglet "Display" que vous avez bien DDI Versions: 10 et Driver Model: WDDM 1.1
image

Maintenant, parlons spécifiquement des éléments pour silverlight:

Les animations via storyboard sont accélérées par le GPU
Si vous créez une animation avec un storyboard, elle utilisera automatiquement le GPU, vous n'avez rien n'a effectuer, c'est automatique

Les animations via code ont besoin de l'attribut CacheMode
Si vous déplacer des éléments via code, ils ne seront pas automatiquement accéléré par le GPU, pour cela, ajouter l'attribut CacheMode="BitmapCache". Attention, ne l'appliquer que si l'élément ne change pas visuellement !!! En effet, si l’élément change, le cache doit être invalidé et on perd tout les avantages du cache…

Compteur de performance
Il est possible d'ajouter un compteur de performance, dans votre code, par exemple dans le constructeur de l'App.cs, ajouter:

Application.Current.Host.Settings.EnableFrameRateCounter = true;

Vous aurez le compteur qui s’affiche en haut de l'écran. Le détails de chaque compteur est dans la capture d’écran… 

image 



Qu'est ce qui est utilisé par le GPU ???
Pour un maximum de performance, il faut qu’un maximum d’éléments soit rendu par le GPU. Il est possible de le voir en ajoutant ceci dans le code:

Application.Current.Host.Settings.EnableCacheVisualization = true;

Tous les éléments qui ne sont pas pris en compte par le GPU n'ont pas leurs couleurs normales.

Qu'est ce qui est redessiné à chaque frame ???
Pour des performances optimales, il est nécessaire de minimiser ce qui est en-train d'être redessinée sur chaque frame. Nous pouvons utiliser ceci dans le code:

Application.Current.Host.Settings.EnableRedrawRegions = true;

Ceci montre une copie fantôme à chaque fois qu’un élément est redessiné. Si vous voyez beaucoup d'éléments qui ont besoin d'être redessiné, alors il est peut-être nécessaire d'ajouter des attributs CacheMode pour décharger le CPU (Pour info, lorsque quelque chose est géré par le GPU, vous ne verrez pas d'éléments redessinés).

Pour plus d'info, je vous conseil l’excellente session de Seema Ramchandani lors du derniers Mix : http://live.visitmix.com/MIX10/Sessions/CL60

Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Besoin d’un nouveau skin pour l’émulateur ?

Vous avez besoin d’un nouveau skin pour l’émulateur Windows Phone 7 ???

Il est possible de le personnaliser en modifiant les fichiers png et xml qui sont dans le répertoire C:\Program Files (x86)\Microsoft XDE\1.0

J'ai réalisé 4 skins, 2 HTC et 2 Samsung. Pour appliquer un skin, il faut:

  1. Télécharger un zip: HTC1, HTC2, SMG1, SMG2
  2. Faire une sauvegarde du fichier C:\Program Files (x86)\Microsoft XDE\1.0\WM7_Skin.xml
  3. Extraire le zip dans C:\Program Files (x86)\Microsoft XDE\1.0\

Vous avez maintenant un nouveau skin pour l'émulateur.

 

image image image image
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,

[WP7] Ajouter un splash screen pour vos applications

La plateforme Windows Phone 7 supporte nativement les splash screens.

Les étapes pour en ajouter un à vos applications sont:

  1. Créer une image d’une taille de 480x800
  2. Sauvegarder l’image en splashscreenimage.jpg
  3. Ajouter l’image dans votre projet wp7
  4. La propriétés Build Action doit être à Content

Et Voila,  vous avez un superbe écran de chargement pour votre application.

image
Posté le par Nicolas | 0 commentaire(s)
Classé sous : ,
Plus de Messages Page suivante »


Les 10 derniers blogs postés

- Après Montréal, ce sera Barcelone, rendez-vous à la European SharePoint Conference 2014 ! par Le blog de Patrick [MVP SharePoint] le il y a 9 heures et 55 minutes

- Emportez votre sélection de la MSDN dans la poche ? par Blog de Jérémy Jeanson le 04-17-2014, 22:24

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le 04-17-2014, 17:03

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le 04-17-2014, 16:54

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le 04-17-2014, 06:34

- [ SharePoint Summit Montréal 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit Montréal 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit Montréal 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57