Dorian LAMANDE & Technologies Microsoft

Portable Class Library

Publié par Dorian LAMANDE le octobre 31, 2012

Cela faisait bien longtemps que je n’avais publié de billet.

Depuis quelques mois je bosse sur Windows 8 et là je suis ammené à faire des applications pour Windows Phone 8 / 7.5.

Je me suis dit : “Ce serait quand même dommage de ne pas réutiliser du code métier pour l’application Windows Phone”.

En effet, ce serait dommage car la “Portable Class Library” est là pour ça !

Ce qui m’intéressait c’était surtout de récuperer la couche d’accès aux services. J’avais développé cette couche avec async / await / HttpClient, qui ne sont pas supportés dans la “Portable Class Library” :( . Du coup, j’ai refait au propre ma library (j’en ai profité pour virer le spécifique WinRT).

Ca y est ça compile ! Je run sur Windows 8 : ça passe !

Passons sur Windows Phone 8.

J’ajoute ma référence à mon projet WP8, ça compile, mais là pas moyen d’avoir mes données ! Analysons :

Dans ma “Portable Class Library” :

private static ManualResetEvent allDone = new ManualResetEvent(false);
public string GetFlux(string url)
{

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    req.Accept = "application/json";


    req.Method = "GET";

    // Création de l'objet état
    RequestState rs = new RequestState();
    //On ajoute la requete dans l'objet état pour pouvoir le récupérer dans la callback
    rs.MyHttpWebRequest = req;

    //Appel asynchrone

    IAsyncResult response = req.BeginGetResponse(result =>
    {
      //Récupération de l'objet etat 
      RequestState state = (RequestState)result.AsyncState;

      //Récupération de la requete web (object HttpWebRequest)
      HttpWebRequest request = rs.MyHttpWebRequest;

      //Récupération de la réponse Web
      HttpWebResponse resp = (HttpWebResponse)request.EndGetResponse(result);

      Stream responseStream = resp.GetResponseStream();
      StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
      _reponseContent = sr.ReadToEnd();
      responseStream.Dispose();

                
        allDone.Set();
       }, rs);

    allDone.WaitOne();

    return this._reponseContent;

}

Sur Windows 8 :

string content = (newService()).GetFlux("http://monservice.com/get/users");

Aucun problème, on peut même binder le content :)

Sur Windows Phone 8 :

Service svc = new Service();
ThreadPool.RunAsync(


(source) =>
{
string content = svc.GetFlux("http://monservice.com/get/users");
}
);

Sur Windows 8, les Thread sont bien Async. On passe bien dans la CallBack avant de sortir de GetFlux, ce qui n’est pas le cas sur Windows Phone !

Du coup il faut utiliser le ThreadPool.RunAsync (Merci Vincent Lepleux  :) )

Cool ! Maintenant on a de la donnée.

Allons un peu plus loin, je veux binder cette donnée. Avec le ThreadPool.RunAsync, je n’aurais pas accès à mon Thread UI !! C’est là qu’intervient notre ami le Dispatcher :

private void BindData(string content)
{
   System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
     MyProperty = content;
   });
}
ThreadPool.RunAsync(

 (source) =>
   {
     string content = svc.GetFlux("http://monservice.com/get/users");
     BindData(content);
    }
);

Et la boucle est bouclée !

Merci à Pierre Cauchois pour sa relecture :)

Publié dans Windows 8, Windows Phone 8 | Poster un commentaire »

WP7 : Comment internationaliser vos applications ?

Publié par Dorian LAMANDE le janvier 18, 2011

Pour toucher un peu plus de monde sur le MarketPlace, il va falloir passer par une phase d’internationalisation de votre application.

Pour commencer on créer une simple application “Hello World”.

image

Ensuite on va ajouter un fichier de ressources : “AppResources”.

image

Ajoute une nouvelle Clef : “HelloWorld” avec la valeur “Hello World !”

image

Copier / Coller le ficher “AppResources.rsx” et renommer le en AppResources.fr.rsx. Ensuite remplace “Hello World !” par “Salut le Monde !”

Maintenant dans le code behind, nous allons dire que notre “PageTitle” contiendra notre “Hello World”.

public MainPage()
        {
            InitializeComponent();
            this.PageTitle.Text = AppResources.HelloWorld;
        }

Ensuite il faut aller éditer le fichier “.csproj” et ajouter “fr” dans le SupportedCulture :

<SupportedCultures>fr</SupportedCultures>

Si vous souhaitez ajouter l’espagnole ce sera comme ceci :

<SupportedCultures>fr;es</SupportedCultures>

Recharger votre solution. Déployer la sur votre émulateur. Nous avons la version anglaise.

image

Maintenant nous allons changer la langue de l’émulateur :

image

Validons et ré-exécutons notre application :

image

(J’ai rajouté un TextWrapping=”Wrap” pour l’affichage)

En complément de ce billet je vous invite à consulter le post de Pierre Cauchois sur “Comment localiser le titre d’une application ?”

http://blogs.msdn.com/b/pierreca/archive/2010/12/06/windows-phone-7-localisez-le-titre-ou-le-nom-de-votre-application.aspx

A bientôt.

Dorian LAMANDE

Publié dans Non classé | 1 commentaire »

Concours Windows Phone – ProgTV

Publié par Dorian LAMANDE le août 25, 2010

Avec Yann Garit, nous participons au concours de développement sur Windows Phone 7 : Rendez vous ici : http://www.facebook.com/home.php#!/video/video.php?v=445160459896&oid=129459787073480 et cliquez sur "J’aime" pour nous soutenir !

C’est à vous de jouer ;)

Dorian LAMANDE

Publié dans Divers | Poster un commentaire »

WPF : Obtenir la “Duration” d’une vidéo

Publié par Dorian LAMANDE le août 9, 2010

Lors d’un projet sur WPF, j’avais besoin d’obtenir la durée d’une vidéo.

Je me suis dit, c’est simple, je vais aller regarder le NaturalDuration… mais hélàs c’était trop simple :

    <Grid>
        <StackPanel Orientation="Horizontal">
        <Label>Duration :</Label>
        <TextBlock x:Name="tbDuration" Margin="0,5,0,0"></TextBlock>
        </StackPanel>
        <MediaElement x:Name="media" Visibility="Collapsed" ></MediaElement>
    </Grid>

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Video Files (*.avi;*.mpg;.*mpeg;*.wmv)|*.avi;*.mpg;.*mpeg;*.wmv";
openFileDialog.ShowDialog();
if (openFileDialog.FileName != String.Empty)
{
    media.Source = new Uri(openFileDialog.FileName);
    this.tbDuration.Text = media.NaturalDuration.TimeSpan.TotalMinutes.ToString();
}
image

Le seul moyen c’est d’entrer dans la méthode “MediaOpened” du mediaElement et de faire un play/pause manuellement.

Lire la suite »

Publié dans WPF | Tagué: | 1 commentaire »

WPF : Binding Enumeration Description

Publié par Dorian LAMANDE le juin 7, 2010

Voici un petit billet pour vous montrer comment “binder” des descriptions qui viennent des enumerations sur des combobox.

1. Création de notre projet :

Ouvrons notre visual studio préféré (le 2010 !). Créons une nouvelle application WPF, que nous appelons “WPFBindingEnumeration.UI”, ajoutons tout de suite un second projet, de type “class library” “WPFBindingEnumeration.Entity” et dernier projet du même type : “WPFBindingEnumeration.Utils”

2. Création de l’énumération :

Ici on va se focaliser sur le cas suivant : notre client voudrait en affichage les situations familiales suivantes : Célibataire, Marié(e), Divorcé(e), Séparé(e), Pacsé(e), Veuf(ve), Autre.

Nous allons utiliser des descriptions afin de pouvoir permettre l’affichage de la liste dans une combobox.

public enum FamilialSituationEnum
{
    [Description("Célibataire")]
    Celibataire,
    [Description("Marié(e)")]
    Marie,
    [Description("Divorcé(e)")]
    Divorce,
    [Description("Séparé(e)")]
    Separe,
    [Description("Pacsé(e)")]
    Pacse,
    [Description("Veuf(ve)")]
    Veuf,
    [Description("Autre")]
    Autre
}

Lire la suite »

Publié dans WPF | Tagué: , , , , | Poster un commentaire »

Microsoft Windows Azure : Application MVC avec SQL AZURE

Publié par Dorian LAMANDE le avril 2, 2010

Créer une application OnPremise est une chose plutôt simple. Et bien sachez que sur la plateforme Azure c’est aussi simple !

Pour notre application MVC, nous avons besoin d’un MembershipProvider, d’un RoleProvider et d’un ProfileProvider. Vous avez déjà pu jouer avec ces Providers via les Azure Tables. Maintenant les providers sont supportés par SQL AZURE. Microsoft a mis à dispositions les scripts qui vont bien.

http://code.msdn.microsoft.com/KB2006191/Release/ProjectReleases.aspx?ReleaseId=3539

Décompressez l’archive. Ouvrez SQL Server Mangement Studio et connectez-vous à votre base de données SQL AZURE. (Note: Fermez le prompt à l’ouverture de SSMS, cliquez sur New Query pour vous connectez)

image 

Lire la suite »

Publié dans Windows Azure | Tagué: , , , , | 2 Commentaires »

Microsoft Windows Azure : Azure Tables et WPF

Publié par Dorian LAMANDE le mars 26, 2010

Vous cherchez comment vous connecter aux Azure Tables autrement qu’avec un projet Cloud ? Je suis seigneur et je vais vous donner la solution.

Je vais me baser sur le post précédent, on va réaliser le même type d’application.

On aura toujours notre dll “Common” mais on va modifier un peu la classe “ContactRepository.cs”.

public class ContactRepository
{
    protected TableServiceContext Context;
    public const string TABLENAME = "Contacts";
    public ContactRepository()
    {
        Initialize();
    }

    //création du client pour accéder à l’Azure Storage
    private void Initialize()
    {
        try
        {                
            CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
            CloudTableClient tableStorageClient = storageAccount.CreateCloudTableClient();
            tableStorageClient.CreateTableIfNotExist(TABLENAME);
            this.Context = tableStorageClient.GetDataServiceContext();

            // en local
            if (storageAccount.Credentials.AccountName == "devstoreaccount1")
            {
                // Dummy, requis pour synchroniser le schéma avec le Development storage
                var dummyRow = new ContactEntry() { PartitionKey = "Dummy", RowKey = Guid.NewGuid().ToString() };
                this.Context.AddObject(TABLENAME, dummyRow);
                this.Context.SaveChangesWithRetries();
                this.Context.DeleteObject(dummyRow);
                this.Context.SaveChangesWithRetries();
            }
        }
        catch (Exception ex)
        {
            
        }

    }

Les CRUD, ne changent pas, ou presque …

 

Lire la suite »

Publié dans Windows Azure | Tagué: , , , | Poster un commentaire »

Microsoft Windows Azure : Les Azure Tables

Publié par Dorian LAMANDE le mars 23, 2010

Cela fait un moment que j’ai envie de faire un petit article sur la plateforme Azure.

Aujourd’hui je vous propose de nous intéresser aux Azure Tables.

Les Azure Tables font parties des services Azure Storage qui sont par ailleurs tous exposés en REST. Nous allons utiliser la dll Microsoft.WindowsAzure.StorageClient fournie par Microsoft dans le SDK (v1.1).

Les Azure Tables ne sont pas à confondre avec une base de données relationnelle. Ce sont de simples tables avec des données de type clé/valeur.

Je vous propose maintenant de jouer avec les Azure Tables.

Pour cela on va créer une petite application de gestion de contacts.

Ouvrons notre IDE préféré : Visual Studio. :)

Nous allons créer un nouveau projet, appelons-le, AzureTableStorage.

On va tout de suite ajouter un projet de type library pour pouvoir séparer notre accès aux Azure tables et notre interface utilisateur en ASP.NET.

Voici donc notre architecture :

image

Lire la suite »

Publié dans Windows Azure | Tagué: , , | Poster un commentaire »

Je vois des Windows Partout

Publié par Dorian LAMANDE le février 10, 2010

L’équipe EMANON a participé à nouveau concours spécialement créé pour les Techdays : “Je vois des Windows partout”.

Nous avons soumis le même document que pour la compétition Imagine Cup. Je suis par ailleurs mentor pour Emanon dans cette compétition. Emanon a été qualifié pour le round 2 d’Imagine Cup.

En ce qui concerne le concours “Je vois des windows partout”, voici la vidéo réalisé lors des Techdays, en mode “One Shoot”.

EMANON – Je vois des Windows Partout

Je vous communiquerai le résultat ASAP.

Publié dans Divers | Tagué: | Poster un commentaire »

Techdays 2010

Publié par Dorian LAMANDE le décembre 20, 2009

sitelaunchLes Techdays auront lieu les 08 09 & 10 Février au Palais des Congrès à Paris.

Au programme :

- 3 conférence plénieres
- + de 300 conférences techniques
- 5500 m² d’exposition
- 20 communautés exposants
- Des experts à votre disposition !

Bien évidemment EPSILAB sera présent et aura son stand sur le thème suivant : Cloud Computing & Web !

Par ici pour les inscriptions ! :)

N’oubliez pas de visiter le blog des Techdays : http://blogs.technet.com/mstechdays/

Publié dans Divers | Tagué: , | Poster un commentaire »

 
Suivre

Recevez les nouvelles publications par mail.