Archive

Posts Tagged ‘Shared’

Renvoyer une nouvelle instance d’une ressource à chaque appel

WPF nous offre plusieurs manières de définir un objet en tant ressource dans notre application, en utilisant :

  • notre fichier App.xaml,
  • un dictionnaire de ressource
  • un style
  • la propriété Resources de notre fenêtre, contrôles intégrés à WPF et contrôles personnalisés (User Control et Custom Control)

La liste ci-dessus n’est pas exhaustive.
Dans notre exemple nous allons définir notre ressource au niveau de notre fenêtre comme suit :

<Window x:Class="WpfApplicationSharedResource.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ObjectDataProvider x:Key="Random"
                            MethodName="Next"
                            ObjectType="{x:Type sys:Random}">
            <ObjectDataProvider.MethodParameters>
                <sys:Int32>100</sys:Int32>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <UniformGrid Rows="1" Columns="2">
        <TextBlock Text="{Binding Path=., Source={StaticResource ResourceKey=Random}}" Background="AliceBlue"
                   FontSize="20"
                   VerticalAlignment="Stretch"
                   HorizontalAlignment="Stretch"
                   TextAlignment="Center" />
        <TextBlock Text="{Binding Path=., Source={StaticResource ResourceKey=Random}}" Background="Cyan"
                   FontSize="20"
                   VerticalAlignment="Stretch"
                   HorizontalAlignment="Stretch"
                   TextAlignment="Center"/>
    </UniformGrid>
</Window>

Dans le code XAML ci-dessus notre ressource utilise un objet de type ObjectDataProvider qui nous permet d’instancier la classe Random et d’appeler sa méthode Next en lui fournissant un entier comme paramètre. Ensuite nous définissons deux objets de type TextBlock qui récupèrent chacun la valeur renvoyer par notre ressource et l’affiche à l’écran.

On sait que la méthode Next de la classe Random est censée renvoyée une valeur aléatoire à chaque appel donc à l’exécution de notre exemple on peut s’attendre à ce que nos deux TextBlock aient des valeurs différentes. Mais si vous l’exécutez, vous verrez bien que ce n’est pas le cas. A chaque exécution les deux TextBlock afficheront la même valeur comme dans l’image ci-dessous :

Comment cela fonctionne ?
Les objets définis en ressource sont évalués lorsque nous essayons d’y accéder pour la première fois. A l’issue de ce premier accès le résultat est stocké en mémoire. Lorsque nous essayons d’y accéder à nouveau, ce sera le résultat stocké en mémoire qui nous sera retourné.
Donc dans notre exemple, l’accès à la ressource par notre premier TextBlock entraîne l’instanciation de la classe Random et l’appel de la méthode Next qui nous renvoie une valeur et c’est cette dernière qui est stockée en mémoire. Notre deuxième TextBlock essayant d’y accéder n’entraînera pas la réévaluation de notre ressource mais recevra tout simplement la valeur stockée en mémoire.

Comment faire pour que notre ressource nous renvoie une nouvelle instance à chaque nouvel accès ?
Pour que notre ressource nous renvoie une nouvelle instance à chaque accès, il va falloir utiliser l’attribut x:Shared et mettre sa valeur à false. Cet attribut permet d’avoir une instance pour chaque demande au lieu de partager la même instance pour toutes les demandes. Inutile de vous dire qu’en mettant la valeur de cet attribut à true cela entraînera le même comportement que l’exemple définit précédemment.

Dans l’exemple précédent, si nous modifions la définition de notre ressource en y ajoutant cet attribut et mettre sa valeur à false , nous verrons que les deux TextBlock auront des valeurs différentes.

N.B : L’attribut Shared n’est pas supporté en Silverlight.

Catégories :Silverlight, WPF Étiquettes : , ,
%d blogueurs aiment cette page :