IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Modification de la valeur d'une Window.Resources xaml via le code d'un module


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut Modification de la valeur d'une Window.Resources xaml via le code d'un module
    Bonjour

    Dans mon application WPF, j'essaye de modifier dynamiquement la valeur de ma ressource nommée "BackgroundBrush" dans mon formulaire xaml.

    Extrait du code xaml de mon formulaire de démarrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <Window.Resources>
            <SolidColorBrush x:Key="BackgroundBrush" Color="LightBlue" />
         </Window.Resources>
    La couleur est utilisée pour colorer des boutons et libellés du formulaire.
    Dans mon application il m'arrive de devoir modifier cette couleur, ce que je fais avec la syntaxe suivante (VbNet):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                CType(myMainWindow.Resources("BackgroundBrush"), SolidColorBrush).Color = ...
    Tout ceci fonctionne parfaitement ... je dirais environ 9 fois sur 10.

    De temps en temps j'obtiens l'erreur suivante:

    Nom : ImpossibleDeDefinirUnePropriete.png
Affichages : 223
Taille : 32,1 Ko

    Je ne trouve vraiment pas la raison.
    y-a-t'il une manière particulière de s'y prendre pour modifier les ressources xaml ?

    Si vous avez une idée, je vous remercie d'avance !

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour
    Il est "freeze" (gele c.à.d non modifiable quelque part dans ton application...Si tu ne trouves pas l'endroit du code cause du souci ,il est toujours possible de verifier son etat actuel et s'il est le cas echeant "freeze" ,il faut le clone pour le render "non freeze" c.à.d modifiable et assigner le clone ...
    code behind .vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Dim myBrush As SolidColorBrush = CType(Application.Current.MainWindow.Resources("BackgroundBrush"), SolidColorBrush)
     
     
            If myBrush.CanFreeze Then
                'Makes the brush unmodifiable.
                myBrush.Freeze()
            End If
     
     
            Me.mainGrid.Background = myBrush
     
     
            If myBrush.IsFrozen Then '  Evaluates to true.
                'If the brush is frozen, create a clone and
                ' modify the clone.
                Dim myBrushClone As SolidColorBrush = myBrush.Clone()
                myBrushClone.Color = Colors.Red
                Me.mainGrid.Background = myBrushClone
            Else
                ' If the brush is not frozen,
                ' it can be modified directly.
                myBrush.Color = Colors.Red
            End If
    bon code...

  3. #3
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Merci MABROUKI !

    Ton intervention me fait avancer, mais pourtant ne résoud pas le problème... pourtant je sens que c'est en partie la bonne piste.
    Je m'explique:

    Ce qui fonctionne, c'est que effectivement, la "SolidColorBrush" est bien Frozen quand le plantage a lieu.
    Il est alors possible, plutôt que de modifier la propriété .Color de cet objet Frozen, de le cloner et de modifier la propriété .Color de l'objet cloné.

    Ce qui en fonctionne pas, c'est que la SolidColorBrush concernée dans les ressources de mon formulaire (fichier xaml) n'est pas impacté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Window.Resources>
            <SolidColorBrush x:Key="BackgroundBrush" Color="LightBlue" />
         </Window.Resources>
     
    (...)
     
    <Button Name="ControlCaption0" Margin="10,2,10,2" Content="Afficher le manuel" Background="{DynamicResource BackgroundBrush}" Click="ButAfficheHelp_Click"/>
    Normal me direz-vous, puisqu'on modifie la propriété d'un clone, et pas de l'objet lui-même... Mais alors comment faire ?

    Dans l'exemple de MABROUKI, on fini par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.mainGrid.Background = myBrushClone
    ce qui veut dire que l'on utilise le clone pour affecter le formulaire.

    Si je veux avoir le même fonctionnement, faut-il que je supprime ma DynamicResource (c'est à dire tout le block <Window.Resources>, ainsi que le "{DynamicResource BackgroundBrush}") et que j'intervienne sur la couleur de chacun des boutons de mon formulaires un à un avec la .Color du clone ? Je trouverais dommage de ne plus utiliser ce <Window.Resources> qui est préconisé pour un codage xaml propre...

    Est-ce conseillé ? Ou avez-vous une meilleure idée ?

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    re-bonjour

    Peut etre est -ce du au fait que tu specifies la resource en tant que dynamic resource ,ce qui veut dire une recherché de la resource au run-time ,ce qui impacte les performances ...Un static resource est recherché à la compilation..
    Change la liaison en static...

    code xaml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <!-- StaticResource reference -->
    <Label Foreground="{StaticResource myBrush}">Label 1</Label>
     
    <!-- DynamicResource reference -->
    <Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>
    bon code...

Discussions similaires

  1. [XL-2007] Modification de la valeur d'une céllule avant impression
    Par Hitman_11 dans le forum Excel
    Réponses: 10
    Dernier message: 10/03/2012, 20h13
  2. [AC-2007] Modification de la valeur d'une zone de texte dans un état
    Par kek's dans le forum IHM
    Réponses: 3
    Dernier message: 09/12/2011, 14h03
  3. Modification de la valeur d'une variable session
    Par patrios dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/04/2008, 10h35
  4. Réponses: 2
    Dernier message: 04/03/2007, 16h59
  5. modification de la valeur d'une cellule
    Par magictom42 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/10/2006, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo