Browsed by
Month: August 2012

How to display the system tray when you open the application bar

How to display the system tray when you open the application bar

Sometimes we need to use the entire screen surface, so you can’t display the system tray, however it is not pleasant for the user, he can’t see the time or see the network status, etc …

I have already proposed two solutions to this problem on this blog:

Today we will see a third way, used in particular by Internet Explorer.

Principle

When a user opens Internet Explorer, there is no system tray. However, by using the application, we realize that the time is displayed when you open the application menu bar (eg by pressing “…”).


Application Bar closed


Application bar opened

We’ll try to reproduce this behavior.

detect the opening of the application bar

This is easy, you only need to register to the StateChanged event of the application bar:


ApplicationBar.StateChanged ApplicationBar_StateChanged += ApplicatioBarStateChange_DisplayTime;

void ApplicatioBarStateChange_DisplayTime(object sender, ApplicationBarStateChangedEventArgs e)
{

bool menuvisible = e.IsMenuVisible;

}

Show system tray

To display the system tray, you need simply to write the following statement:


SystemTray.IsVisible = true;

By combining the two previous source codes, we get the behavior we wanted:


ApplicationBar.StateChanged += ApplicationBar_StateChanged;

void ApplicatioBarStateChange_DisplayTime(object sender, ApplicationBarStateChangedEventArgs e)
{

SystemTray.IsVisible = e.IsMenuVisible;

}

And voila!

Some glitch!

Our application has the behavior we wanted, however, we note that the page shifts when the system tray is displayed.

To remove this, use a small hack, instead of displaying the system tray with a opacity of 100%, use an opacity of 99%, the visual effect is almost unchanged, but the system tray will now come over the content and will not shift.


<phone:PhoneApplicationPage x:Class="Wikipedia.BrowsePage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
..
shell:SystemTray.Opacity="0.99" >

You can, if you want, put a lower value for the opacity.

Conclusion

With a few lines of code, we were able to reproduce the behavior of Internet Explorer, your users will no longer have to leave your application to view network status or what time is it.

Comment afficher la system tray lorsque l'on ouvre l'application bar

Comment afficher la system tray lorsque l'on ouvre l'application bar

Parfois on a besoin de la totalité de la surface de l’écran, on ne peut donc se permettre d’afficher la system tray (la barre en haut de l’écran avec l’heure, l’état du réseau, etc…), toutefois cela est handicapant pour l’utilisateur, il ne pourra ni voir l’heure, ni voir l’état du réseau, etc… Il sera alors obligé de sortir de votre application ou pire, il pourra penser que votre application rame alors qu’en réalité il capte mal le réseau.

J’ai déjà proposé deux solutions à ce problème sur ce blog :

Nous allons voir aujourd’hui une troisième façon, utilisé notamment par internet explorer.

Le principe

Lorsque l’on ouvre l’application internet explorer, on se rend compte que celle-ci ne dispose pas de system tray. Toutefois en utilisant l’application, on se rend compte que l’heure est bien affiché lorsque l’on ouvre le menu de l’application bar (notamment en appuyant sur “…”).

Application Bar fermée
application bar ouverte

 

 

 

 

 

 

 

 

 

 

 

 

Nous allons donc tenté de reproduire ce comportement.

Détecter l’ouverture de l’application bar

Ceci est plutôt facile, il suffit uniquement de s’enregistrer sur l’évènement StateChanged de l’application bar :


ApplicationBar.StateChanged += ApplicationBar_StateChanged;

void ApplicatioBarStateChange_DisplayTime(object sender, ApplicationBarStateChangedEventArgs e)
{

bool menuvisible = e.IsMenuVisible;

}

Afficher la system tray

Pour demander l’affichage de la barre d’affichage, il suffit d’écrire l’instruction suivante :


SystemTray.IsVisible = true;

En combinant les deux codes précédents, on arrive au comportement que l’on souhaitait :


ApplicationBar.StateChanged += ApplicationBar_StateChanged;

void ApplicatioBarStateChange_DisplayTime(object sender, ApplicationBarStateChangedEventArgs e)
{

SystemTray.IsVisible = e.IsMenuVisible;

}

Et voilà !

Enfin presque

Lorsque l’on teste l’application, on a bien le comportement que l’on souhaitait, toutefois, on remarque que la page se décale lorsque la system tray s’affiche alors que l’ont souhaite qu’elle s’affiche par dessus le contenu.

Pour cela, utilisons un dernière petit hack, au lieu d’afficher la system tray avec une opacité de 100%, affichons là avec 99%, l’effet visuel sera quasi inchangé, mais la system tray viendra maintenant par dessus le contenu et ne le décalera pas :


<phone:PhoneApplicationPage x:Class="Wikipedia.BrowsePage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
..
shell:SystemTray.Opacity="0.99" >

Vous pouvez évidemment mettre une valeur plus basse pour l’opacité.

Conclusion

Et voilà en quelques lignes de codes, on a réussi à reproduire le comportement d’internet explorer, vos utilisateurs ne seront donc plus obligé de sortir de votre application pour voir l’état du réseau ou l’heure, ce qui est un grand plus.

HyperLink, RichTextBlock et liens extérieurs

HyperLink, RichTextBlock et liens extérieurs

Pour ma nouvelle application Wikipedia, qui va remplacer MyEncyclopedia, j’utilise le contrôle RichTextBlock, contrôle très puissant mais pas forcément très “intuitif”, un des celles contrôles qui sans documentation n’est pas facile à utiliser.

Je vais donc en profiter pour partager une petite astuce avec vous.

Il est possible d’ajouter des éléments hyperlink à votre richtextblock, celle-ci dispose notamment d’une propriété NavigateUri qui correspond à la page que l’on souhaite afficher. Un exemple :

<richTextBox>
    <paragraph>
        Ce texte contient un lien vers <hyperlink NavigateUri="http://www.rudyhuyn.com">ce blog</hyperlink>.
    </paragraph>
</richTextBox>

 

Si le chemin est relatif alors Windows Phone cherchera à afficher une page XAML de votre application, si le chemin est une URL absolue comme “http://www.bing.com” il cherchera à…. non pas internet explorer mais la page “http://www.bing.com”, qui n’existe pas évidemment.

Comment indiquer à HyperLink que l’on souhaite lancer Internet Explorer ?

Il y a bien un évènement Click, on pourrait donc s’en contenter, sauf que HyperLink ne contient pas de DataContext et encore moins de Tag, il est donc difficile de lui “passer” la valeur du lien en paramètre.

En fait l’astuce est très simple, il suffit de modifier la valeur par défaut de la propriété TargetName en lui indiquant par exemple “_blank”. Lorsque l’utilisateur cliquera alors sur le lien, Internet Explorer s’affichera alors avec la page indiqué.

<richTextBox>
    <paragraph>
        Ce texte contient un lien vers <hyperlink TargetName="_blank" NavigateUri="http://www.rudyhuyn.com">ce blog</hyperlink>.
    </paragraph>
</richTextBox>

Pour information, l’astuce fonctionne aussi avec le contrôle HyperlinkButton !

Activer Windows 8 Entreprise

Activer Windows 8 Entreprise

Comme vous le savez sûrement Windows 8 vient de sortir en version RTM.  Si vous êtes possesseur d’un compte MSDN, vous avez probablement téléchargé la version entreprise.

Toutefois, il existe un problème d’activation avec cette version. Aucune clé produit ne vous sera demandé à l’installation et lorsque vous essayerez d’activer votre version, Windows va vous indiquer qu’un problème a eu lieu avec l’activation.

On pourrait supposer un problème avec les serveurs d’activation, ce qui n’est pas le cas, le problème est ailleurs.

Si vous allez dans le panneau de configuration, vous verrez qu’une clé produit est déjà présente mais différente de celle fourni sur le site MSDN. Windows essaie donc de s’activer avec une clé produite incorrecte.

Malheureusement, il n’est pas possible de la modifier dans le panneau de configuration, et pour cause, Windows 8 Entreprise doit être activé en volume et non individuellement.

Il est toutefois possible d’installer un hôtes KMS (Key Management Server) sur sa propre machine qui va s’occuper de gérer la clé de volume et donc d’enregistrer le produit, pour cela, il faudra passer par la ligne de commande.

Sur l’écran d’accueil, tapez “cmd” et faites un clic droit sur “invité de commande”

sélectionnez dans le menu en bas “exécutez comme administrateur”.

Il vous suffit maintenant de taper dans la console :

slmgr.vbs -ipk VOTRE_CLE_PRODUIT_MSDN

 

Et voilà, votre Windows est maintenant activé !

Les applications du marketplace sont-elles vraiment cryptées ?

Les applications du marketplace sont-elles vraiment cryptées ?

Vous avez pu le lire un peu partout, les applications du marketplace sont maintenant encryptées, mais comme on ne fait jamais mieux confiance qu’à soit même, vérifions cela !

Ceci est donc évidemment une très bonne nouvelle pour nous les développeurs et permettra peut être de réduire le piratage de nos applications.

Connaitre son taux de transformation version d'essai/version payante

Connaitre son taux de transformation version d'essai/version payante

Comme vous le savez sûrement, le app hub Windows Phone Developper Center a été mis à jour il y a quelques jours. En plus d’une ergonomie et une rapidement revu à la hausse, pas mal de nouvelles fonctionnalités ont été discrètement ajoutées.

Parmi celle-ci, je retiendrais une nouveauté qui est plutôt intéressante lorsque vous souhaitez étudier l’impact de votre application lorsque celle-ci possède un mode d’évaluation (trial mode).

Le mode d’évaluation est un gros plus de windows phone, il permet à vos utilisateurs d’essayer l’application pendant quelques jours avant de ce décider à l’acheter, toutefois jusqu’à il y a peu de temps, il était difficile d’évaluer la pertinence de ce mode :

  • Est ce que j’ai laissé assez de temps à l’utilisateur pour tester l’application ?
  • Ai-je trop bridé les fonctionnalités ?

Lorsque l’on souhaite réaliser une étude sur cela, il est important de connaitre le taux de conversion, c’est à dire combien de personnes ont acheté l’app sur l’ensemble des personnes l’ayant essayée.

Il était impossible de calculer ce ratio, ce qui n’est plus le cas maintenant. Voyons comment faire.

Dans Windows Phone Developper Center, allez dans l’onglet Reports, un graphique s’affichera alors avec le nombre de téléchargement par jour et cumulatifs. Sélectionnez l’application que vous souhaitez étudier et cliquez sur Export.

 

Un fichier excel sera alors téléchargé contenant l’ensemble des statistiques de téléchargement pour la période sélectionnée.

Ouvrez le fichier et cliquez sur l’onglet Download details report.

Vous allez pouvoir voir une différence par rapport à auparavant, il y a maintenant les types de téléchargement :

Trial
Paid (without trial)
Paid (after trial)
Reversal
Reversal Canceled

On peut donc voir que l’on distingue maintenant les téléchargements avec ou sans essai (et accessoirement on voit apparaître les reversal :demande de remboursement de l’app et leurs cousins “reversal canceled” qui correspond à une annulation de remboursement).

Grâce à cela, il suffit de calculer :

Pour avoir notre ratio de transformation. Si ce dernier est au dessus de 10% c’est déjà très bien, si ce n’est pas le cas, revoyez alors vos limitations dans le mode trial.

 

 

Comment (bien) récupérer le numéro de version de l’application

Comment (bien) récupérer le numéro de version de l’application

Un code très simple aujourd’hui mais terriblement efficace.

Lorsque l’on fait une recherche internet sur “Comment récupérer le numéro de version de l’application”, on a 95% de chances de trouver un solution erronée. Par exemple :

http://stackoverflow.com/questions/3833354/how-to-get-app-version-in-windows-phone
http://stackoverflow.com/questions/4153049/get-assembly-version-on-windows-phone-7

var nameHelper = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
var version = nameHelper.Version;

 

String appVersion = System.Reflection.Assembly.GetExecutingAssembly().FullName.Split('=')[1].Split(',')[0];

 

var versionString = assembly.GetCustomAttributes(false)
.OfType()
.First()
.Version;

 

private static string GetVersionNumber()
{
var asm = Assembly.GetExecutingAssembly();
var parts = asm.FullName.Split(',');
return parts[1].Split('=')[1];
}

etc…

Autant le dire tout de suite : aucune de ces solutions n’est correct.

Pourquoi ?

Tout simplement car c’est sur le App Hub Windows Phone Dev Center que l’on spécifie le numéro de l’application et non dans les assemblies. Lorsque l’on soumet son application, le WPDC insère bien le numéro de version dans l’application, mais pas au niveau des assemblies, mais au niveau du WMAppManifest.xml. Rappelons que ce fichier est totalement regénéré par le WPDC, il est donc par exemple totalement inutile de modifier manuellement les capabilities, le nom de l’application, etc… seul les noeuds  Tasks, Tokens et Extensions seront récupérés, le reste sera totalement ignoré.

Solution

J’avais prévenu, le code est ultra simpliste, il se contente d’ouvrir le fichier WPAppManifest.xml, de parser le fichier, de récupérer le noeud App et son attribut Version, puis de récupérer que la partie qui nous intéresse (1.2.0.0 ==> 1.2)


public static String GetVersionNumber()
{
try
{
var app = XElement.Load("WMAppManifest.xml");
var version=app.Element("App").Attribute("Version").Value;
return version.Substring(0, version.IndexOf('.', version.IndexOf('.')+1));
}
catch
{
return "";
}
}

Pourquoi quand je teste ça retourne 1.0 alors que mon application est en 2.3?

Tout simplement car vous testez votre application sans être passé par le app hub, votre WMAppManifest.xml n’a donc pas encore été modifié.

Bon code !

Update

Le store ne met plus à jour automatiquement le numéro de version dans le fichier WMAppManifest depuis quelques mois. Prenez soin de le mettre à jour manuellement avant toute soumission