Archives de Catégorie: Windows 8

[Windows 8] Réimplémenter le RemoveBackEntry

Dans le cas d’un projet, il me fallait empêcher le retour sur la page précédente mais revenir sur une page particulière. Exemple : MainPage –> Page Sommaire –> Page 1 –> Page 2 –> Page 3
Le bouton précédent depuis les pages 1 à 3 devait me ramener sur la page Sommaire.

Ma première réflexion a été d’utiliser le GoBack juste avant de naviguer vers la page suivante. Sur PC, ce retour en arrière ne se voyait pas mais sur une tablette ARM, le chargement de la page précédente puis de la suivante était flagrant et inésthétique.

J’ai donc cherché le RemoveBackEntry comme il existe sur Windows Phone pour supprimer la page précédente, mais malheureusement il n’existe pas en WinRT… Mais il est possible de manipuler la pile de navigation !

Manipuler la pile de navigation

La méthode GetNavigationState d’un objet Frame nous permet de récupérer la pile de navigation sérialisée sous forme de string tandis que SetNavigationState nous permet de la modifier.

Avertissement

La documentation du GetNavigationState, le précise bien. Il est formellement déconseillé de le faire, cette méthode est utilisée en interne et la manière de sérialiser peut être modifiée par Microsoft dans une version future de Windows. Son usage permet actuellement de stocker la page courante de l’utilisateur lors de la fermeture de l’application et de le ramener sur cette page à la prochaine ouverture.

Autre point, la déserialisation est impossible si vous passez des objets entre 2 pages. Ce système ne marchera que si vous faites une navigation basique d’une page à une autre. Si vous souhaitez passer des objets utilisez des Messengers ou simplement un Cache, mais ce n’est pas le sujet de l’article.

Mettons les mains dans le cambouis

La méthode GetNavigationState() va nous retourner une chaîne sous cette forme :

1,3,2,31,MonNamespace.MainPage,12,0,40,MonNamespace.Sommaire,0,33,MonNamespace.Page1,0

Découpons la chaînes et expliquons chaque partie :

1,3,2 :

  • 1, je ne sais pas… Certainement le signalement du début de la chaîne
  • 3, correspond au nombre de pages dans la pile
  • 2, à l’id de la page courante

31, MonNamespace.MainPage, 12, 0

  • 31 correspond à l’id du type de la page chargée
  • MonNamespace.MainPage est le type de la page chargée
  • 12, aucune idée, ce nombre n’est présent que dans l’ensemble lié à la 1ère page
  • 0, je pense que c’est le séparateur entre chaque page, on le retrouve à la fin de chaque page chargée

40,MonNamespace.Sommaire,0

  • 40 correspond à l’id du type de la page chargée
  • MonNamespace.Sommaire est le type de la page chargée
  • 0, idem que précédemment

Vous avez compris la structure. L’idée est donc, pour supprimer le dernier élément, de le retirer de la chaîne de caractère, et de décrémenter l’ID de la page courante ainsi que le nombre de pages chargées.

Pour cela, je me suis créé une méthode d’extension à la classe Frame :

public static classFrameExtension
{
public static void RemoveBackEntry(thisFrameframe)
{
varparts = frame.GetNavigationState().Split(‘,’);
varcount =Int32.Parse(parts[1]);

if(count > 1)
{
parts[1] = (
int.Parse(parts[1]) – 1).ToString();
parts[2] = (
int.Parse(parts[2]) – 1).ToString();
varstate =String.Join(« , », parts, 0, parts.Length – 3);

frame.SetNavigationState(state);
}
}
}

Quelques précisions

Il nous suffit donc de faire un this.Frame.RemoveBackEntry pour supprimer la dernière page visitée de notre pile de navigation. L’appel sur GoBack() nous ramènera sur la page encore précédente. Exemple : MainPage –> SommairePage-> Page1->RemoveBackEntry->Page2. Depuis la page 2, GoBack nous ramènera sur SommairePage.

Attention, l’appel du SetNavigationState() lance une navigation vers la page courante (normal vu qu’il doit être appelé au démarrage de l’application pour repositionner l’utilisateur sur la page sur laquelle il était) du coup, le “OnNavigatedTo” de votre page sera appelé en mode GoBack, pensez-y si vous avez un comportement bizarre.

Par JCVASSELON

[Windows 8] Portage de LittleWatson

LittleWatson est un outil permettant de récupérer et d’envoyer par email les exceptions non gérées sur Windows Phone. Il a été développé par Andy Pennell (http://blogs.msdn.com/b/andypennell/archive/2010/11/01/error-reporting-on-windows-phone-7.aspx).

Je vais vous expliquer ici comment le porter sur Windows 8.

Fonctionnement

LittleWatson contient deux méthodes importantes :

  • ReportException : Qui enregistre l’exception dans l’Isolated Storage
  • CheckForPreviousException : Qui vérifie dans l’Isolated Storage s’il existe une exception précédemment enregistrée puis génère un email. Une fois envoyé, elle supprime le fichier.

ReportException, se place dans le Application_UnhandledException  de l’App.xaml.cs ainsi que dans le NavigationFailed.
De cette manière, nous pouvons récupérer toutes les exceptions non traités ainsi que les erreurs de navigation.

Au démarrage de l’application, on lance CheckForPreviousException pour vérifier l’existence d’un rapport d’erreur et le transmettre le cas échéant.

Portage

J’ai gardé le même fonctionnement sous Windows 8. Il faut cependant modifier la partie d’enregistrement qui diffère ainsi que la gestion des emails. Vous trouverez un exemple ici : http://sdrv.ms/RiiHeS

Pour les emails, vous retrouverez ma classe EmailChooserTask que je développe plus amplement dans cet article (https://onefor4.wordpress.com/2012/09/03/windows-8-lancer-lapplication-email-depuis-une-application/).

La sérialisation se passe ici dans le Local Storage. J’ai fait un Storage Helper pour enregistrer directement vos rapports. Mais vous pouvez implémenter votre propre solution de stockage en modifiant les méthodes SafeDelete et SafeLoad. Vous trouverez d’ailleurs un helper tout prêt ici : http://winrtstoragehelper.codeplex.com/

Problématiques

– Je n’ai pas trouvé comment récupérer les exceptions asynchrones. Si vous avez des retours, des idées, n’hésitez pas que j’améliore ce composant.

– Vous ne souhaitez peut-être pas que vos utilisateurs voient ce formulaire. Pensez à utiliser les directives #if DEBUG #endif autour des appels de LittleWatson. De cette manière, les exceptions ne seront enregistrées qu’en mode Debug.

Conclusion

Nous avons vu dans cet article comment enregistrer une exception puis la récupérer facilement pour l’envoyer par email.
A vous maintenant de voir si vous souhaitez garder un historique de log à l’intérieur de l’application ou utiliser d’autres moyens pour récupérer ces rapports.

Par JC VASSELON

[TIP] Changer la couleur de l’état indéterminé d’une ProgressBar sous Windows 8

Si vous avez essayé de modifier la couleur de la ProgressBar en changeant sa propriété « Foreground », vous avez pu vous rendre compte que celle ne faisait rien…. Ceci est dû au fait que la couleur est définie par la couleur d’accentuation de l’utilisateur (modifiable depuis les paramètres du PC, champs Personnaliser, onglet Ecran d’accueil) et non pas par la propriété Foreground.

Vous pouvez tout de même la modifier en déclarant une chaîne de caractère portant la clé « ProgressBarIndeterminateForegroundThemeBrush »dans les ressources de votre application. Cela aura pour effet de surcharger la couleur de la ProgressBar sur toute l’application :

<x:String x:Key="ProgressBarIndeterminateForegroundThemeBrush">#FF1E4C82</x:String>

Solution par Mathieu Hollebecq
Mise en forme par JC VASSELON

[Windows 8] Déplacer éléments dans une liste

Il est parfois intéressant de laisser l’utilisateur la possibilité d’agencer une liste à sa manière.
Sur Windows Phone, des contrôles personnalisés existent comme la Reorder List de Bewise (http://bewisephonecontrols.codeplex.com/).

Déplacer des éléments sous Windows 8

Sous Windows 8, la GridView et la ListView supportent ce comportement par défaut. Pour cela, il faut configurer les propriétés suivantes :

  • CanReorder= »True »
  • AllowDrop= »True »
  • CanDragItems= »True »

Problématiques

En mode tactile, sur un GridView, si le ScrollViewer vertical est activé vous ne pourrez pas déplacer les éléments. Pour éviter cela, vous pouvez passer par une ListView ou si vous n’en avez pas besoin désactivez le scroll en mettant la propriété : ScrollViewer.VerticalScrollMode sur « Disabled ».

La ListView a un système de déplacement particulier, en effet il faut soit laisser appuyer sur l’élément soit le tirer sur la droite ou la gauche pour le déplacer verticalement.

Illustration : Screen shot showing the disambiguation threshold.

(source :
http://msdn.microsoft.com/en-us/library/windows/apps/hh465299.aspx )

Vous trouverez un exemple ici : https://skydrive.live.com/redir?resid=3929B7A47D0F06D!604&authkey=!AOct7PEtAxVl9I4

Par JC VASSELON

[Windows 8] Lancer l’application Email depuis une application

Edit du 25/10/2012 et préambule :

Dans le cas où vous souhaitez partager des données internes à l’application (une news, un programme tv, etc), l’utilisation du contrat de partage est préférable. Vous partagez une information ou une donnée en provenance de votre application.

Mais il peut arriver que vous souhaitiez envoyer une information particulière à un utilisateur particulier. Exemple, une exception qui aurait été levée et gérée depuis le code. Ou créer un formulaire précis pour que les utilisateurs vous contactent. C’est ce que nous détaillerons ici.

Email Compose Task

Sous Windows Phone, il existait le launcher EmailComposeTask pour envoyer des emails.

Sous Windows 8, il semblerait que le seul moyen soit d’appeler une uri de type mailto (ex: mailto:toto@nomdedomaine.com?subject=bonjour…).

Je vous propose ici un helper pour envoyer un email de la même manière que sous Windows Phone. La syntaxe redevient un peu plus verbeuse et lisible. A la sortie, c’est tout de même un mailto qui est créé.

using System;
using System.Threading.Tasks;

namespace Helpers
{
/// <summary>
/// Allows an application to launch the email 
    application with a new message displayed. 
    Use this to allow users to send email 
    from your application.
/// </summary>
public class EmailComposeTask
{
    /// <summary>
    /// Gets or sets the subject of 
        the new email message.
    /// </summary>
    public string Subject { get; set; }

    /// <summary>
    /// Gets or sets the body of the new email message.
    /// </summary>
    public string Body { get; set; }

    /// <summary>
    /// Gets or sets the recipients (separated by a comma)
        on the To line of the new email message.
    /// </summary>
    public string To { get; set; }

    /// <summary>
    /// Gets or sets the recipients (separated by a comma)
        on the Cc line of the new email message.
    /// </summary>
    public string Cc { get; set; }

    /// <summary>
    /// Gets or sets the recipients (separated by a comma)
        on the Bcc line of the new email message.
    /// </summary>
    public string Bcc { get; set; }

    /// <summary>
    /// Shows the email application with a new message 
        displayed.
    /// </summary>
    /// <returns></returns>
    public async Task Show()
    {
        var mailto = 
new Uri(String.Format("mailto:?subject={0}&body={1}
&to={2}&cc={3}&bcc={4}", Subject, Body, To, Cc, Bcc));
        await Windows.System.Launcher.LaunchUriAsync(mailto);
    }
}
}

 

On retrouve donc les différents propriétés avec sans surprise :

  • Subject pour le sujet
  • Body pour le contenu
  • To pour le / les destinataires (séparés par une virgule ou un point virgule
  • Cc pour le / les destinataires en copie (idem pour la séparation)
  • Bcc pour le / les destinataires en copie invisible (Cci)

La méthode Show() génère l’url et y accède, lançant ainsi l’application email.

Vous pouvez télécharger la classe ici : https://skydrive.live.com/redir?resid=3929B7A47D0F06D!603&authkey=!AGDcvVDdlkOhLcU

Note : vous pouvez aussi directement utiliser la syntaxe mailto depuis un HyperLinkButton.

Par JC VASSELON

Redondance sans disque dynamique, ni RAID matériel

D’habitude, je suis plus intéressé pour faire des articles sur du code que de l’admin, mais récemment, j’ai été confronté à un besoin assez particulier, celui de faire la résilience de données. Ok sur le principe, rien de bien excitant ni bien inhabituel, on met en place un RAID 1, ou un disque miroir depuis Windows, et le problème est réglé. Je vous dirais bien oui, mais j’avais bien évidemment plusieurs contraintes.

La première : j’ai deux disques durs de tailles différentes (un de 1 To et l’autre de 250 Go), donc on oublie le RAID1 matériel.

Pour la seconde, l’utilisation des partitions miroirs implique que les disques durs soient mis en mode dynamique, chose que je ne voulais absolument pas (problèmes pour dépanner, migrer la machine, Linux,…), donc là aussi pas possible.

Quelle solution alors ? J’ai voulu éviter l’utilisation de logiciel secondaire et j’ai décidé de profiter d’une nouveauté de Windows 8, à savoir les Pool de stockages (Storage Spaces). Ces pools utilisent plusieurs disques durs pour créer un espace de stockage simple avec différentes options de résilience. Vous pourriez me faire la remarque que les Storage Spaces utilisent eux aussi des disques de manière intégrale. Et c’est ce que j’ai fait en utilisant non pas deux disques durs physiques, mais deux disques durs virtuels (VHD) stockés sur des partitions distinctes appartenant chacune à un disque dur physique bien distincts comme le montre le schéma ci-dessous :

Disque dur 1

Disque dur 2

Nous avons donc 2 VHDs de même taille (60 Go chacun par exemple), stockés sur les deux disques durs. Pour arriver à faire cela, il nous aller dans le gestionnaire des disques pour y créer les deux VHD :

clip_image005

En prenant soin de les mettre chacun sur des partitions différentes, donc le premier sur le volume D, et le deuxième sur le volume E (pour rappel, D apparentant au disque dur physique 1, et E appartenant au disque dur physique 2) :

clip_image006

Les deux disques durs virtuels doivent ainsi apparaitre dans le gestionnaire de disques :

image

Nous pouvons maintenant créer le pool de stockage en utilisant ces deux disques virtuels. Trouver l’option dans le panneau de configuration, et commencer à créer un pool de stockage. Les deux disques virtuels doivent apparaitre avec le nom « Microsoft Virtual Disk », avec précisé qu’ils sont attachés par VHD.

image

 

Attention, la création d’un pool supprime l’intégralité des données présentes sur le disque (ici, Windows n’affiche pas d’avertissements vu que les disques ne sont pas encore formatés, ni même initialisé en MBR/GPT). Pas de risques dans notre cas, nous pouvons créer le pool.

Immédiatement, Windows nous propose de créer un Storage space. Nous indiquons juste le type de résilience (two-way mirror), la capacité du Space (celle qui sera effectivement disponible), et nous pouvons valider :

image

Automatiquement, une nouvelle partition est créée et doit automatiquement être montée.

Et nous voilà donc avec notre espace de stockage résilient. Ainsi, si vous perdez un de vos disques durs, vous pourrez toujours accéder à vos données étant donné que vos données sont écrites en dupliqués sur les 2 VHD. On peut toutefois se demander comment récupérer les données dans ce cas. En fait, le fait de monter un des VHD active automatiquement le Storage Space. Bien évidemment, si un seul disque est présent, le Storage Space va indiquer qu’il y a un problème avec le pool, mais la partition sera quand même montée, et vous pourrez récupérer vos données.

Il manque juste une seule chose à faire, monter les VHD au démarrage de l’ordinateur pour que le Storage Space soit remonté aussi. En effet, Windows ne permet pas le montage des VHD au démarrage. Concernant le Storage Space, celui-ci détecte tout seul les disques qui participe dans un pool, et remonte automatique le pool, et ses espaces associés. Dans notre cas, dès qu’un des VHD sera remonté, le pool sera reconstruit et l’espace de stockage remonté.

Bref, passons au montage automatique des VHD. Plusieurs solutions existent. La plus simple est d’utiliser le logiciel VHD Attach, mais vous pouvez aussi tenter d’utiliser un script DiskPart ou PowerShell (DiskPart me causait des problèmes personnellement, et PowerShell nécessite d’avoir une partie des fonctionnalités d’Hyper-V installée).

Je vous propose donc d’installer VHD Attach, puis d’allez dans les options du logiciel :

clip_image011

Il nous fait simplement ajouter les 2 VHD à monter automatiquement, et au prochain démarrage, le pool devrait être remonté automatiquement.

clip_image012

Install Windows 8 from USB Key

(Article disponible en français à cette adresse : https://onefor4.wordpress.com/2011/09/05/crez-une-cl-usb-bootable-pour-installer-windows-7/ )

From graphical user interface

Nowadays, when you buy a new laptop, you may have no DVD drive. In this case, if you want to install Windows 8 or Windows 7, you will not be able to burn a DVD and install the system from it.

Fortunately, quite all motherboards allow us to boot from an USB key. We will use it to launch the Windows 8 setup. First, we have to get the iso file used to the system set up. MSDN subscribers can download it legally. For the others, if you have bought the DVD, you can create an iso file from a computer with a DVD drive, softwares like poweriso or deamon tools lite will create it for you.

Once you have your iso file, you have to put it on the USB key but not from a simple copy/paste. Some additional operations are needed. Microsoft have created a freeware to create bootable USB keys for Windows 7, Windows 7 USB/DVD Download Tools, you can download it on the Microsoft Store.

You just have to launch the software, select the iso, your usb key and start the copy. Once all these operations ended, the USB key is ready, you can launch the install.

But sometimes, with some iso files (especially from MSDN), the copy fails and you obtain the following error “We were unable to copy your files. Please check your USB device and the selected ISO file and try again” while your iso have been checked and so your usb key.

In this case, we will have to use the command line interface.

By the command line interface

Requirements

The first step is easy : plug your usb key Sourire Then, download an utility to create virtual dvd drives like poweriso or deamon tools lite. If you are running the Windows 8 Release Preview, you will not need another software, Windows 8 do it for you. Finally, mount the iso and check the letter assigned to your virtual drive (here F: ).

Format the USB key with Diskpart

The following step consists in create a primary active partition on the key and format it in NTFS. For that, we use the CLI utility diskpart. In Windows 7, launch the CLI in administrator mode by clicking “start”, “all programs”, “accessories”, right click on “Command prompt” and “launch as administrator”. On windows 8, type “command line” on the start menu, right click on “command prompt” and “launch as administrator”. Now, type:

diskpart

The command line now switches to the disk management utility named “diskpart”. List all available disks with:

list disk

You can see that my USB key is “disk 2” (obviously, not the 931 GB drive Sourire). To create the partition and format it in NTFS:

select disk 2 (replace the number corresponding to your usb key)

clean

create partition primary

select partition 1

active

format fs=ntfs (formatting can last several minutes)

assign (a letter is assigned to your usb key, maybe different from the letter assigned in the beginning)

exit

Create the boot sector of your usb key with bootsect

After “exit”, you are again on the starting CLI. Open “computer” to know the letter assigned to your usb key (here G: ). You will first set on the “boot” folder on the virtual Windows 8 DVD :

F: cd boot (replace F: by the letter corresponding to your virtual dvd drive)

cd boot

Then a last command will allow booting on your usb key

bootsect.exe /nt60 g: (replace G by your usb key letter)

And to finish, simply copy/paste all files from your DVD to your USB key and set your BIOS to check USB boot before hard drive boot.

Happy installation, and enjoy Windows Sourire

By Mathieu Hollebecq