If-Then-Else – Conditional XAML Sample

In this article you can find some samples about the conditional Xaml.
The conditional Xaml tag describe here is not a preprocessor directive like « #if #else #endif ».
It’s more like an « if{} else{} » in C#

Installation

To install Conditional XAML, run the following command in the Package Manager Console
PM> Install-Package ConditionalXAML

Namespace

In your xaml page you must include a namespace for the library downloaded from Nuget.

<Page
    ...
    xmlns:sb="using:SamuelBlanchard.Controls.Statements"
    ...
>

basic sample

<StackPanel>
    <ToggleSwitch x:Name="Checkbox" IsOn="True"></ToggleSwitch>

    <sb:Statement FontSize="30">
        <sb:If Then="Bonjour" Else="Au revoir">
            <sb:BooleanCondition Value1="{Binding ElementName=Checkbox, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
        </sb:If>
    </sb:Statement>
</StackPanel>

conditions

<StackPanel>
    <ToggleSwitch x:Name="CheckboxConditions" IsOn="True"></ToggleSwitch>
    <Slider x:Name="SliderConditions" Value="50"></Slider>
    <TextBox x:Name="TextBoxName" Text="Samuel"></TextBox>
    <DatePicker x:Name="DatePickerConditions1"></DatePicker>
    <DatePicker x:Name="DatePickerConditions2"></DatePicker>

    <sb:Statement FontSize="30">
        <sb:If Then="Bonjour" Else="Au revoir">
            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxConditions, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
            <sb:DoubleCondition Value1="{Binding ElementName=SliderConditions, Path=Value}" Operator="Greater" Value2="60.0"></sb:DoubleCondition>
            <sb:StringCondition Value1="{Binding ElementName=TextBoxName, Path=Text}" IsCaseSensitive="False" Operator="StartsWith" Value2="Sam"></sb:StringCondition>
            <sb:DateTimeOffsetCondition Value1="{Binding ElementName=DatePickerConditions1,Path=Date}" Operator="Greater" Value2="{Binding 

ElementName=DatePickerConditions2,Path=Date}"></sb:DateTimeOffsetCondition>
        </sb:If>
    </sb:Statement>
</StackPanel>

Conditions (Bonus)

<StackPanel>
    <sb:Statement FontSize="30">
        <sb:If Then="Landscape" Else="Portrait">
            <sb:ScreenOrientationCondition Orientation="IsLandscape"/>
        </sb:If>
    </sb:Statement>
    <sb:Statement FontSize="30">
        <sb:If Then="Design" Else="RunTime">
            <sb:IsDesignerModeCondition/>
        </sb:If>
    </sb:Statement>
</StackPanel>

Logical operator

<StackPanel>
    <ToggleSwitch x:Name="CheckboxOp" IsOn="True"></ToggleSwitch>
    <Slider x:Name="SliderOp" Value="50"></Slider>
    <TextBox x:Name="TextBoxOp" Text="Samuel"></TextBox>
    <DatePicker x:Name="DatePickerOp1"></DatePicker>
    <DatePicker x:Name="DatePickerOp2"></DatePicker>

    <sb:Statement FontSize="30">
        <sb:If Then="Bonjour" Else="Au revoir">
            <sb:Or>
                <sb:Or.Conditions>
                    <sb:Not>
                        <sb:Not.Conditions>
                            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxOp, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
                        </sb:Not.Conditions>
                    </sb:Not>
                    <sb:Xor>
                        <sb:Xor.Conditions>
                            <sb:DoubleCondition Value1="{Binding ElementName=SliderOp, Path=Value}" Operator="Greater" Value2="60.0"></sb:DoubleCondition>
                            <sb:StringCondition Value1="{Binding ElementName=TextBoxOp, Path=Text}" IsCaseSensitive="False" Operator="StartsWith" Value2="Sam"></sb:StringCondition>
                        </sb:Xor.Conditions>
                    </sb:Xor>
                </sb:Or.Conditions>
            </sb:Or>
            <sb:DateTimeOffsetCondition Value1="{Binding ElementName=DatePickerOp1,Path=Date}" Operator="Greater" Value2="{Binding 

ElementName=DatePickerOp2,Path=Date}"></sb:DateTimeOffsetCondition>
        </sb:If>
    </sb:Statement>
</StackPanel>

Then+Else

<StackPanel>
    <ToggleSwitch x:Name="CheckboxThenElse" IsOn="True"></ToggleSwitch>
                    
    <sb:Statement FontSize="30">                                                
        <sb:If>
            <sb:ScreenOrientationCondition Orientation="IsPortrait"></sb:ScreenOrientationCondition>
                            
            <sb:If.Then>
                <Button Content="Bonjour"></Button>
            </sb:If.Then>
            <sb:If.Else>
                <sb:If Else="Rien du tout">
                    <sb:BooleanCondition Value1="{Binding ElementName=CheckboxThenElse, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
                    <sb:If.Then>
                        <DatePicker></DatePicker>
                    </sb:If.Then>
                </sb:If>
            </sb:If.Else>                            
        </sb:If>
    </sb:Statement>
</StackPanel>

Binding Result

<StackPanel>
    <ToggleSwitch x:Name="CheckboxResult" IsOn="True"></ToggleSwitch>

    <sb:Statement FontSize="30" ShowResult="False">
        <sb:If x:Name="IfVisibility" Then="Visible" Else="Collapsed">
            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxResult, Path=IsOn}" Value2="True"></sb:BooleanCondition>
        </sb:If>
    </sb:Statement>
                    
    <Button Content="Hello" Visibility="{Binding ElementName=IfVisibility, Path=Result}"></Button>
                    
</StackPanel>

You can found the complete sample here.

0  

If gentil Then cadeau Else baton



HoHoHo ! C’est bientôt le moment des cadeaux de noël, petit ami développeur !

pere-noel-geek

As-tu été un bon petit codeur ? As-tu bien implémenté ? Bien MVVMé ? Bien publié ?
La ! la ! c’est bon !
Regarde dans la cheminée de ton chalet secondaire ce que le Père noël XAML t’apporte un peu en avance !

92411529

Du XAML Conditionnel !

Ah ! Enfin du If-Then-Else dans nos pages XAML chéries !
Attention on ne parle pas ici de directive de préprocesseur (comme #if #else #endif en C#) mais bien de balise conditionnelle (if{}else if{} en c#).

Avant de passer aux exemples commençons par installer la librairie dans notre projet.

Installation

Rien de plus facile puisque c’est un paquet NuGet !
Attention il ne fonctionne que pour les applications WinRT (Universal).

Un bouton droit sur notre projet WinRT, puis « Manage NuGet Packages »

NugetManage

Cherchez le paquet « Conditional XAML » puis installer. Le tour est joué !

NugetConditionalXaml

Vous ne comprenez rien à Nuget (Huh!), Je vous mets la librairie ici, bien au chaud.
Attention tout de même car seul NuGet sera mis à jour par la suite !

Namespace

Rajoutez maintenant un namespace dans votre page xaml qui pointe vers la librairie comme suit :

<Page
    ...
    xmlns:sb="using:SamuelBlanchard.Controls.Statements"
    ...
>

Maintenant On peut commencer à utiliser nos nouvelles balises !

Avec des si

Pour débuter, un premier exemple tout simple.
Ajoutez pour la démo un ToggleSwitch à notre page (Une sorte checkbox dont l’attribut IsOn renvoie true ou false)

<StackPanel>
    <ToggleSwitch x:Name="Checkbox" IsOn="True"></ToggleSwitch>
</StackPanel>

Puis à la suite du ToggleSwitch la balise Statement. Celui ci sera chargé d’héberger la balise if et d’afficher éventuellement son résultat.

<sb:Statement>
...
</sb:Statement>

On va maintenant ajouter la balise if.

<sb:Statement>
   <sb:If Then="Bonjour" Else="Au revoir">
   ...
   </sb:If>
</sb:Statement>

Comme vous le voyez les attributs Then et Else correspondent aux résultats du if.
Ici deux chaines de caractères « Bonjour » et au « Revoir ».
Mais il manque encore la condition.
On souhaiterait vérifier que le IsOn de la Checkbox est vrai.
On utilise donc une condition de test pour Boolean :

<sb:BooleanCondition Value1="{Binding ElementName=Checkbox, Path=IsOn}" Operator="Equal"Value2="True"/>

ou en simplifiant, la valeur d’ »Operator » étant « Equal » par défaut :

<sb:BooleanCondition Value1="{Binding ElementName=Checkbox, Path=IsOn}" Value2="True"/>

La première valeur de cette condition (Value1) contient un Binding dont la source pointe vers la CheckBox via ElementName.
Le Path pointe vers la propriété « IsOn » de la CheckBox que l’on veut tester.

Finalement on obtient :

<sb:Statement>
   <sb:If Then="Bonjour" Else="Au revoir">
       <sb:BooleanCondition Value1="{Binding ElementName=Checkbox, Path=IsOn}" Operator="Equal"Value2="True"/>
   </sb:If>
</sb:Statement>

Lorsque l’on teste l’application, si la Checkbox est cochée le tag Statement affiche « Bonjour » dans le cas contraire « Au revoir ».

basic

Basic-Off

Autres conditions

J’ai implémenté quelques conditions de base pour que le if couvre la plupart des cas que l’on peut rencontrer dans une application.

BooleanCondition : gère le type bool.

DoubleCondition : gère le type double. Permet de comparer deux valeurs de type double avec les operateurs ==, !=, >, >=, <, <=

StringCondition : gère le type String. Permet de comparer deux valeurs de type string avec les actions suivantes : Equal, Different, Contains, StartsWith, EndsWith, RegEx. RegEx permet de tester une expression régulière ce qui est assez pratique dans des scénarios de comparaison complexe. Une propriété IsCaseSensitive permet d’effectuer la comparaison en prenant en compte ou non la casse de la chaine.

DateTimeCondition, DateTimeOffsetCondition, TimeSpanCondition : gère le temps et la durée. Très pratique pour tester des valeurs des contrôles tel que DatePicker ou TimePicker.

Comme on peut ajouter autant de condition que l’on souhaite dans un if voila un exemple d’utilisation de plusieurs conditions à la suite :

<StackPanel>
    <ToggleSwitch x:Name="CheckboxConditions" IsOn="True"></ToggleSwitch>
    <Slider x:Name="SliderConditions" Value="50"></Slider>
    <TextBox x:Name="TextBoxName" Text="Samuel"></TextBox>
    <DatePicker x:Name="DatePickerConditions1"></DatePicker>
    <DatePicker x:Name="DatePickerConditions2"></DatePicker>

    <sb:Statement FontSize="30">
        <sb:If Then="Bonjour" Else="Au revoir">
            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxConditions, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
            <sb:DoubleCondition Value1="{Binding ElementName=SliderConditions, Path=Value}" Operator="Greater" Value2="60.0"></sb:DoubleCondition>
            <sb:StringCondition Value1="{Binding ElementName=TextBoxName, Path=Text}" IsCaseSensitive="False" Operator="StartsWith" Value2="Sam"></sb:StringCondition>
            <sb:DateTimeOffsetCondition Value1="{Binding ElementName=DatePickerConditions1,Path=Date}" Operator="Greater" Value2="{Binding ElementName=DatePickerConditions2,Path=Date}"></sb:DateTimeOffsetCondition>
        </sb:If>
    </sb:Statement>
</StackPanel>

Bonus:

J’ai rajouté également deux comparaisons très pratiques (encore des cadeaux !).
Il s’agit de :

ScreenOrientationCondition : Permet de comparer l’orientation actuelle

IsDesignTimeCondition : Permet de déterminer si l’on est en mode design ou pas

<StackPanel>
    <sb:Statement FontSize="30">
        <sb:If Then="Landscape" Else="Portrait">
            <sb:ScreenOrientationCondition Orientation="IsLandscape"/>
        </sb:If>
    </sb:Statement>
    <sb:Statement FontSize="30">
        <sb:If Then="Design" Else="RunTime">
            <sb:IsDesignerModeCondition/>
        </sb:If>
    </sb:Statement>
</StackPanel>

J’écrirais un article prochainement sur la création de condition complémentaire mais en attendant si vous trouvez d’autres conditions n’hésitez pas à me laisser un commentaire.

Opérateur logique

Comme vous l’avez vu dan le dernier paragraphe il est possible d’ajouter autant de conditions dans la balise if que l’on désire.
Par défaut on effectue pour chaque résultat de condition un ET logique pour obtenir le resultat final. Mais Il est également possible d’utiliser d’autre opérateurs logiques :

Or : OU logique effectué entre tous les enfant de la balise

Not: Inverse le résultat global issu de tous les enfants de la balise. Il est aussi possible d’utiliser l’attribut « IsInverted » sur toutes les conditions et tous les If.

Xor : really ?

<StackPanel>
    <ToggleSwitch x:Name="CheckboxOp" IsOn="True"></ToggleSwitch>
    <Slider x:Name="SliderOp" Value="50"></Slider>
    <TextBox x:Name="TextBoxOp" Text="Samuel"></TextBox>
    <DatePicker x:Name="DatePickerOp1"></DatePicker>
    <DatePicker x:Name="DatePickerOp2"></DatePicker>

    <sb:Statement FontSize="30">
        <sb:If Then="Bonjour" Else="Au revoir">
            <sb:Or>
                <sb:Or.Conditions>
                    <sb:Not>
                        <sb:Not.Conditions>
                            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxOp, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
                        </sb:Not.Conditions>
                    </sb:Not>
                    <sb:Xor>
                        <sb:Xor.Conditions>
                            <sb:DoubleCondition Value1="{Binding ElementName=SliderOp, Path=Value}" Operator="Greater" Value2="60.0"></sb:DoubleCondition>
                            <sb:StringCondition Value1="{Binding ElementName=TextBoxOp, Path=Text}" IsCaseSensitive="False" Operator="StartsWith" Value2="Sam"></sb:StringCondition>
                        </sb:Xor.Conditions>
                    </sb:Xor>
                </sb:Or.Conditions>
            </sb:Or>
            <sb:DateTimeOffsetCondition Value1="{Binding ElementName=DatePickerOp1,Path=Date}" Operator="Greater" Value2="{Binding 

ElementName=DatePickerOp2,Path=Date}"></sb:DateTimeOffsetCondition>
        </sb:If>
    </sb:Statement>
</StackPanel>

Ceux qui suivent encore s’apercevront que les enfants des balises Or,Not et Xor sont contenus dans une balise « Conditions » au lieu d’être directement placé à l’intérieur. C’est pour pallier à un bug qui empêche l’affichage de contenu direct après un certain niveau dans la hiérarchie: « Syntax Error found in XBF generation ». Si vous connaissez la solution à ce problème n’hésitez pas à me laisser un commentaire.

Then et Else

Les attributs Then et Else sont de type Objet.
Ils peuvent donc contenir autre chose que des chaînes de charactère.
Ils peuvent par exemple contenir du XAML, des StaticResources et même d’autre If !

<StackPanel>
    <ToggleSwitch x:Name="CheckboxThenElse" IsOn="True"></ToggleSwitch>
                    
    <sb:Statement FontSize="30">                                                
        <sb:If>
            <sb:ScreenOrientationCondition Orientation="IsPortrait"></sb:ScreenOrientationCondition>
                            
            <sb:If.Then>
                <Button Content="Bonjour"></Button>
            </sb:If.Then>
            <sb:If.Else>
                <sb:If Else="Rien du tout">
                    <sb:BooleanCondition Value1="{Binding ElementName=CheckboxThenElse, Path=IsOn}" Operator="Equal" Value2="True"></sb:BooleanCondition>
                    <sb:If.Then>
                        <DatePicker></DatePicker>
                    </sb:If.Then>
                </sb:If>
            </sb:If.Else>                            
        </sb:If>
    </sb:Statement>
</StackPanel>

Attribut Result

Il peut arriver que seul le résultat du If nous intéresse afin que ce résultat soit bindé sur un autre control.
L’affichage du statement doit donc être désactivé.
Pour ce faire, on affecte la propriété « ShowResult » du control Statement à false.
Il ne nous reste plus qu’à binder la propriété « Result » du If sur le controle.

<StackPanel>
    <ToggleSwitch x:Name="CheckboxResult" IsOn="True"></ToggleSwitch>

    <sb:Statement ShowResult="False">
        <sb:If x:Name="IfVisibility" Then="Visible" Else="Collapsed">
            <sb:BooleanCondition Value1="{Binding ElementName=CheckboxResult, Path=IsOn}" Value2="True"></sb:BooleanCondition>
        </sb:If>
    </sb:Statement>
                    
    <Button Content="Hello" Visibility="{Binding ElementName=IfVisibility, Path=Result}"></Button>
                    
</StackPanel>

Ce type de Binding est très utile pour gérer des formulaires, des affichages d’images bref de modifier n’importe quelle propriété d’un contrôle.

Conclusion

Hohoho ! Alors votre cadeau de joyeux X-MAL ? Il vous plaît ?
Le père noël voulait remercier également le lutin Benjamin Roux pour son aide sur les collections de DependencyObject :)

Le projet reprenant tous les exemples de cet article se trouve ici.

Merry XMAS les amis !

SantaSmoke

0  

Quand la boite de dialogue n’est plus ton ami.

Bien que j’apprécie l’API WinRT pour développer des apps universelles je ne peux m’empêcher de penser que la peinture n’est pas totalement sèche en ce qui concerne Windows (Phone) 8.1.
L’objet de cet article est de vous montrer un exemple de problème apporté par ce manque de finition mais également un moyen simple de le contourner.

MessageDialog m’a tué

Lorsque je veux communiquer des messages importants à l’utilisateur de mon app je lui affiche une boite de dialogue.
En Silverlight cela se passe comme ceci :

MessageBox.Show("Hello world!");

En WinRT c’est à peine plus compliqué :

var dialog = new MessageDialog("Hello world!");
await dialog.ShowAsync();

Jusqu’ici tout va bien.

Imaginons maintenant qu’un DispatcherTimer ou une Task de votre cru décide de lancer une seconde boite de dialogue pendant que la première est affichée que va t’il se passer ?

En Silverlight, la seconde boite attendra sagement son tour et s’affichera lorsque la première sera fermée.

Nice !

WinRT considère qu’une seule boite de dialogue peut être affichée à la fois n’en déplaise aux travailleurs parallèles. Une exception sera donc levée lors de l’affichage de la seconde boite et fermera votre application.

Sad !

sh nazg durbatulûk

J’aimerai retrouver un comportement de boite de dialogue similaire à celle de Silverlight.
A savoir, lorsque plusieurs boites doivent être affichées au même moment, elles attendront leur tour pour s’afficher.

On va donc mettre en place un sémaphore qui sera chargé d’attendre le tour du ShowAsync de MessageDialog.

static SemaphoreSlim semaphore = new SemaphoreSlim(1);

public static async Task ShowOrWaitAsync(this MessageDialog dialog)
{            
	await semaphore.WaitAsync();

	try
	{
		await dialog.ShowAsync();
	}
	finally
	{
		semaphore.Release();
	}
}

On préférera utiliser ici SemaphoreSlim plutôt qu’un Mutex par exemple pour sa capacité à travailler de manière asynchrone.

La méthode ayant été déclarée comme méthode d’extension de « MessageDialog » grâce au paramètre « this » nous allons pouvoir écrire pour chaque boîte de dialogue à appeler le code suivant :

MessageDialog dialog = new MessageDialog("Test 0");
await dialog.ShowOrWaitAsync();

Elle attendra patiemment son tour en cas de conflit d’affichage.

Merci qui ?

Vous trouverez la solution du projet ici. La classe à inclure dans votre projet s’appelle « DialogManager ».En Bonus, elle gère également les ContentDialog de Windows Phone qui souffre du même mal.

Je trouve vraiment dommage que ce genre de scénario, finalement assez courant, ne soit pas prise en charge nativement par l’API.
Mais Windows 10 arrive bientôt, et j’ai espoir que tous ces petits tracas seront bientôt de l’histoire ancienne.

Win10IsComing

0  

Règle « Association d’URI » pour le concours « Docteur Souris »

Nokia organise via DVLUP un concours qui me tient particulièrement à cœur puisqu’il s’agit de faire une bonne action en amusant les enfants et adolescents des hôpitaux par le biais d’application sur téléphone et tablette (Windows Phone et Windows).

Comme Nokia a également un grand cœur il permettra de gagner des téléphones dernière génération ou des points DVLUP (Chouette !).
Faisant partie du jury je ne pourrai malheureusement pas participer au concours mais je me frotte les mains en pensant aux futures applications présentées.

Trêve de bavardage, pour participer et connaitre les règles du concours rendez-vous directement à cette url :
https://www.dvlup.com/Challenge/599

Une dernière règle importante

Parmi les quelques règles énoncées sur DVULP il en manque une sur le site DVLUP (pour le moment) particulièrement importante :

Les applications doivent impérativement associer une URI du type :
masuperapp:docteursouris
ou masuperapp sera le nom de votre application.

Dans le cas où le nom de votre app correspondrait à un schéma réservé (http: par exemple) vous pouvez le remplacer par le schèma de votre choix.

Mais pourquoi cette règle ?

Le but ultime de ce concours est d’obtenir une application « Docteur Souris » capable de lancer d’autre apps les applications de ce concours.
Or pour lancer des apps à partir d’une autre app, il faut qu’elles soient pourvues d’une association d’URI.

En suivant ce lien vous trouverez, en détail, comment implémenter cette association d’URI :
http://msdn.microsoft.com/fr-FR/library/windows/apps/xaml/hh779670

et un exemple complet ici :
http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec/

Conclusion

Ne passer pas à côté de cette règle importante du concours car elle seul permettra aux enfants de s’amuser sur nos smartphones et tablettes en toute simplicité.
Bon courage et à vos clavier !

PS: Un grand merci à Kévin Trélohan pour l’idée et la mise en place de ce concours avec l’aide toujours efficace et conviviale d’Olivier Lovisa de chez Nokia. Une spécial dédicace pour Franck Nguessan qui s’occupe de la réalisation de l’application lanceur « Docteur Souris ».

0  

Connectivity version 12 pour WP8.1



« Microsoft.Smartdevice.Connectivity » est une librairie fournit par Microsoft qui permet de se connecter à Windows Phone (device ou emulateur) afin gérer les applications développeurs (installation, désinstallation, lancement) et de lire leurs IsolatedStorages.

Si vous êtes intéressé par le fonctionnement de base de cette DLL, vous pouvez relire cet article sur le sujet

La nouvelle version de Connectivity vient d’arriver avec le SDK WP8.1, c’est le moment de faire le point sur les nouveautés.
Malheureusement, cette librairie n’a pas, à ma connaissance, de page officielle mise à jour sur MSDN.
Je vais donc vous livrer les informations que j’ai pu recueillir en la décompilant et qui m’ont servies à mettre à jour mon application IsoStoreSpy.

De nouvelles racines

Globalement, la librairie fonctionne de la même manière que ses prédécesseurs mais une différence de taille est venu se glisser dans cette release.
En effet, Il est possible d’accéder, sous certaines conditions, à d’autre répertoire que celui de l’isolatedStorage.
Dans les cadres des applications WP8.1, trois racines sont désormais accessibles (contre une auparavant) :

- « Local » qui représente l’IsolatedStorage classique (valeur par défaut)
- « Roaming » qui permet d’accéder au données du Roaming
- « Temp » qui est un dossier temporaire

On accède donc à l’IsoStore en ajoutant simplement la chaine d’une des racines à la méthode GetIsolatedStore :

// WP8 old Style:
// var storage = SelectedApplication.GetIsolatedStore();

// WP8.1 new Style :
var storage = SelectedApplication.GetIsolatedStore("Roaming");

Et les apps WP8 ?

Malheureusement, les racines « Roaming » ou « Temp » ne sont pas accessibles des applications WP8 même sur un device WP8.1 (ce qui est facilement compréhensible vu qu’il n’y a pas d’accès niveau code).

Il faut donc une manière simple de détecter qu’une app est compiler pour WP8 ou pour WP8.1.

On va utiliser ici l’exception ArgumentException générer par l’accès aux méthodes de Connectivity dans un contexte de Roaming.

        public bool IsSelectedApplicationIsWP8
        {
            get
            {
                if( _IsSelectedApplicationIsWP8 == null )
                {
                    try
                    {
                        this.SelectedApplication.GetIsolatedStore("Roaming").GetDirectoryListing(string.Empty);
                        _IsSelectedApplicationIsWP8 = false;
                    }
                    catch (ArgumentException)
                    {
                        _IsSelectedApplicationIsWP8 = true;
                    }
                }

                return _IsSelectedApplicationIsWP8.Value;
            }
        }

        private bool? _IsSelectedApplicationIsWP8 = null;

On n’a plus qu’a tester IsSelectedApplicationIsWP8 pour voir si l’on peut afficher ou non les racines complémentaires.

Des chemins d’accès modifiés

Les chemins d’accès au répertoires et fichiers ont également été modifiés par l’utilisation de ces nouvelles racines :

ainsi pour les devices WP8 la racine de base de l’application était la suivante :

string root = @"%FOLDERID_APPID_ISOROOT%\" + APP_PRODUCT_ID + "\"

elle devient celle ci pour WP8.1 :

string root = @"%FOLDERID_APPID_ISOROOT%\" + APP_PRODUCT_ID + "\" + RACINE + "\" 

la chaine APP_PRODUCT_ID represente le GUID de l’app et RACINE une des chaines suivantes :

- « %LOCL% » pour la racine Local
- « %ROAM% » pour la racine roaming
- « %TEMP% » pour la racine temp

Détruire des fichiers

Une coquille c’était glisser dans la dernière version de Connectivity pour WP8. Il était impossible de détruire des fichiers.
C’est ennuyeux mais heureusement cette fonctionnalité est de nouveau opérationnelle !

conclusion

Je me doute que cet article ne servira qu’a très peu de personnes vu la nature des services de cette librairie mais sachez que plusieurs Bothans sont morts pour nous fournir ces informations.
Ca calme.

0