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 :

Trigger en xaml


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut Trigger en xaml
    Bonjour tout le monde,

    je développe une application pour Windows 8.1 et j'ai un petit souci coté XAML.

    J'essaye de mettre en place un trigger pour faire disparaitre un textblock sur le clic d'un bouton.

    Voici le code :

    Code xaml : 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
    25
    26
    27
    28
    29
    <StackPanel Grid.Row="1" Background="SteelBlue">
                <Grid x:Name="GridMenu" >
                    <TextBlock x:Name="TbIsibudget" Text="IsiBudget" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" />
                    <ToggleSwitch  HorizontalAlignment="Left" Margin="50,0,0,0" VerticalAlignment="Center" Width="100" OnContent="Recherche" OffContent="Recherche" Toggled="ToggleSwitch_Toggled"/>
                </Grid>
     
                <Grid>
                    <Button x:Name="BtnTest">
                        <Button.Triggers>
                            <EventTrigger>
                                <EventTrigger.RoutedEvent>Button.Click</EventTrigger.RoutedEvent>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation
                                            Storyboard.TargetName="Test" 
                                            Storyboard.TargetProperty="(TextBlock.Opacity)"
                                            From="1.0" To="0.0" Duration="0:0:1" 
                                            AutoReverse="True" RepeatBehavior="Forever" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </Button.Triggers>
                    </Button>
                    <TextBlock x:Name="Test" Text="AAAA" FontSize="25" Margin="150,0,0,0" Opacity="0">
     
                    </TextBlock>
     
                </Grid>
            </StackPanel>

    Le problème est que sur VS, le "Click" de la ligne
    "<EventTrigger.RoutedEvent>Button.Click</EventTrigger.RoutedEvent>"
    est souligné en bleu avec un message d'erreur : Routed event descriptor field 'ClickEvent' missing.

    Du coup quand je lance l'appli, la textblock apparait puis disparait sans arrêt !

    Quelqu'un aurait une idée ?

    Merci de votre contribution !

    EDIT : je me suis trompé de fofo, je voulait poster dans WPF sorry ! Un admin pour déplacer ^^' ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Bonjour,
    Avec WinRT (et Silverlight) le seul EventTrigger qui marche encore c’est le Loaded de souvenir...
    A mon avis tu peux oublier les triggers et t’orienter vers les VisualState à la place. Un truc dans ce gout-là :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <Button>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Pressed">
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="Test"
                            Storyboard.TargetProperty="(TextBlock.Opacity)"
                            From="1.0" To="0.0" Duration="0:0:1" 
                            AutoReverse="True" RepeatBehavior="Forever" />
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </Button>
    Par contre j’ai un gros doute sur la cible de ton storyboard ; à mon avis ça ne fonctionnera que si Test fait partie du template de ton bouton. Mais bon, ça se teste (je ne suis pas encore super à l’aise avec les carences de WinRT par rapport à WPF).
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Qu'entends tu par "template du bouton" ?

    J'ai essayé
    Code xaml : 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
    <Button x:Name="BtnTest" Click="BtnTest_OnClick" Margin="196,-28,0,28">
                        <TextBlock x:Name="Test" Text="AAAA" FontSize="25" Margin="150,0,0,0" />
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <DoubleAnimation
                            Storyboard.TargetName="Test"
                            Storyboard.TargetProperty="(TextBlock.Opacity)"
                            From="1.0" To="0.0" Duration="0:0:1" 
                            AutoReverse="True" RepeatBehavior="Forever" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                     </Button>
    et
    Code xaml : 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
    <Button x:Name="BtnTest" Click="BtnTest_OnClick" Margin="196,-28,0,28">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <DoubleAnimation
                            Storyboard.TargetName="Test"
                            Storyboard.TargetProperty="(TextBlock.Opacity)"
                            From="1.0" To="0.0" Duration="0:0:1" 
                            AutoReverse="True" RepeatBehavior="Forever" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                     </Button>
                        <TextBlock x:Name="Test" Text="AAAA" FontSize="25" Margin="150,0,0,0" />
    et les deux n'ont rien donné ...

    EDIT : j'ai l'impression que dans le code que tu m'as fourni, on ne dit nul part au xaml de s'abonner au click sur le bouton pour lancer l'évènement ?

    Est-ce qu'il existe un autre moyen de faire apparaitre / disparaitre des contrôles ?

    J'ai vraiment pas envie de mettre un visible = true / false, je veux une belle appli lol ^^


    Merci ! Bonne soirée !

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Citation Envoyé par Phossoyeur Voir le message
    Qu'entends tu par "template du bouton" ?
    Le template d’un control c’est grossièrement l’arbre XAML qui compose ce dernier. Dans le cas d’un bouton, par défaut on y trouve un Border qui contient un ContentPresenter (entre autres choses). Donc, sauf à redéfinir le style de ton bouton, ce dernier ne possèdera pas intrinsèquement un TextBlock nommé "Test" au sein de son template.

    Je t’ai filé ce bout de code sans grande conviction, sachant que de toute manière tu n’aurais pas pu t’en sortir avec ton EventTrigger.

    Maintenant il existe un petit package NuGet que j’ai utilisé dans une de mes applis et qui fait très bien le job ; WinRTTriggers (pour le récupérer tu fais clic droit sur "Références" > "Gérer les packages NuGet").

    Et tu pourrais ensuite faire un truc dans ce gout-là :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Button>
        <triggers:Interactions.Triggers>
            <triggers:EventTrigger EventName="Click">
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeTest}" />
            </triggers:EventTrigger>
        </triggers:Interactions.Triggers>
    </Button>

    En prenant soin de déclarer le storyboard ciblé en ressources :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Page.Resources>
        <Storyboard x:Key="FadeTest">
            <DoubleAnimation
                Storyboard.TargetName="Test"
                Storyboard.TargetProperty="(TextBlock.Opacity)"
                From="1.0" To="0.0" Duration="0:0:1" />
        </Storyboard>
    </Page.Resources>

    Et le namespace adéquat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:triggers="using:WinRT.Triggers"
    ça je sais que ça fonctionne ^^

    Par contre je viens de relire ton message d’origine "la textblock apparait puis disparait sans arrêt !", c’est un peu normal qu’avec ton storyboard le control apparaisse puis disparaisse sans arret, c’est toi qui lui a demandé de faire ça avec les propriétés "AutoReverse" à "True" (qui signifie que lorsqu’il a terminé son animation, il le refait en sens inverse) et "RepeatBehavior" à "Forever" (qui comme son nom l’indique signifie que le storyboard va s’exécuter indéfiniment).
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Ok super merci ! Je teste ça dans l'aprem !

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bon ben sa marche nikel merci ^^


    Par contre du coup comment est ce que je peux faire pour faire un opacity 0 => 1 quand l'opacity du text block est égale à 0 et opacity 1 => 0 quand l'opacity du text block est égale à 1?

    Merci ;-)

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Ben là tu vas atteindre les limites du "je veux tout faire sans une ligne de C#" ^^'

    Ne pas pourrir le code-behind avec du code métier c’est une chose, mais ça ne sert à rien de se mettre des bâtons dans les roues en voulant absolument tout faire via le XAML.

    Bon... malgré mon sermon, je pense qu’avec la lib que je t’ai conseillé tu peux encore t’en sortir en faisant un truc du style (pas testé, je ne garantis rien) :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Button>
        <triggers:Interactions.Triggers>
            <triggers:EventTrigger EventName="Click">
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeOutTest}">
                    <triggers:Condition LeftOperand="{Binding ElementName=Test, Path=Opacity}" Operator="Equals" RightOperand="1.0"/>
                </triggers:ControlStoryboardAction>
     
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeInTest}">
                    <triggers:Condition LeftOperand="{Binding ElementName=Test, Path=Opacity}" Operator="Equals" RightOperand="0.0"/>
                </triggers:ControlStoryboardAction>
            </triggers:EventTrigger>
        </triggers:Interactions.Triggers>
    </Button>

    En déclarant évidemment les deux storyboards en ressources :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Storyboard x:Key="FadeOutTest">
        <DoubleAnimation
            Storyboard.TargetName="Test"
            Storyboard.TargetProperty="(TextBlock.Opacity)"
            From="1.0" To="0.0" Duration="0:0:1" />
    </Storyboard>
     
    <Storyboard x:Key="FadeInTest">
        <DoubleAnimation
            Storyboard.TargetName="Test"
            Storyboard.TargetProperty="(TextBlock.Opacity)"
            From="0.0" To="1.0" Duration="0:0:1" />
    </Storyboard>

    Bon par contre j’ai un gros doute sur RightOperand="1.0" ; à mon avis il ne va pas aimer comparer une valeur de type double (la propriété Opacity) et une chaine de caractère (le "1.0" et le "0.0"). Si ça ne fonctionne effectivement pas, peut être essayer de déclarer deux autres ressources bien typées :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <x:Double x:Key="VisibleOpacity">1.0</x:Double>
    <x:Double x:Key="HiddenOpacity">0.0</x:Double>

    Et d’y faire référence dans les conditions du trigger :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Button>
        <triggers:Interactions.Triggers>
            <triggers:EventTrigger EventName="Click">
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeOutTest}">
                    <triggers:Condition LeftOperand="{Binding ElementName=Test, Path=Opacity}" Operator="Equals" RightOperand="{StaticResource VisibleOpacity}"/>
                </triggers:ControlStoryboardAction>
     
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeInTest}">
                    <triggers:Condition LeftOperand="{Binding ElementName=Test, Path=Opacity}" Operator="Equals" RightOperand="{StaticResource HiddenOpacity}"/>
                </triggers:ControlStoryboardAction>
            </triggers:EventTrigger>
        </triggers:Interactions.Triggers>
    </Button>
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Wazaaaaa ^_^'

    Même avec les ressources double sa ne passe pas.

    Le truc c'est que je sais pas si en C# c'est possible de faire ça !

    Je vais tenter deux trois trucs on verra

    Merci beaucoup en tout cas !

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Avec un poil de C# tu as pleins de possibilités, l'une d'elle (pas très MVVM compliant, mais c'est pour illustrer le principe) :
    Code xaml : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <Page
        x:Class="W8App.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:triggers="using:WinRT.Triggers"
        mc:Ignorable="d">
     
        <Page.Resources>
            <Storyboard x:Key="FadeOutTest">
                <DoubleAnimation
                    Storyboard.TargetName="Test"
                    Storyboard.TargetProperty="(TextBlock.Opacity)"
                    From="1.0" To="0.0" Duration="0:0:1" />
            </Storyboard>
     
            <Storyboard x:Key="FadeInTest">
                <DoubleAnimation
                    Storyboard.TargetName="Test"
                    Storyboard.TargetProperty="(TextBlock.Opacity)"
                    From="0.0" To="1.0" Duration="0:0:1" />
            </Storyboard>
        </Page.Resources>
     
        <triggers:Interactions.Triggers>
            <triggers:PropertySetTrigger RequiredValue="True" Binding="{Binding Path=IsTextVisible}" >
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeInTest}"/>
            </triggers:PropertySetTrigger>
     
            <triggers:PropertySetTrigger RequiredValue="False" Binding="{Binding Path=IsTextVisible}" >
                <triggers:ControlStoryboardAction Action="Start" Storyboard="{StaticResource FadeOutTest}"/>
            </triggers:PropertySetTrigger>
        </triggers:Interactions.Triggers>
     
        <StackPanel Background="SteelBlue" >
            <Grid >
                <TextBlock Text="IsiBudget" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" />
                <ToggleSwitch  HorizontalAlignment="Left" Margin="50,0,0,0" VerticalAlignment="Center" Width="100" OnContent="Recherche" OffContent="Recherche" />
            </Grid>
     
            <Grid>
                <TextBlock x:Name="Test" Text="AAAA" FontSize="25" Margin="150,0,0,0" Opacity="1.0"/>
     
                <Button Click="OnButtonClick"/>
            </Grid>
        </StackPanel>
    </Page>

    Et le code-behind de la vue :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using Windows.UI.Xaml;
     
    namespace W8App
    {
        public sealed partial class MainPage : INotifyPropertyChanged
        {
            private bool _isTextVisible;
     
            public bool IsTextVisible
            {
                get { return _isTextVisible; }
                set
                {
                    _isTextVisible = value;
     
                    OnPropertyChanged();
                }
            }
     
            public MainPage()
            {
                InitializeComponent();
     
                DataContext = this;
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void OnPropertyChanged([CallerMemberName] string propName = "")
            {
                if (PropertyChanged != null) {PropertyChanged(this, new PropertyChangedEventArgs(propName));}
            }
     
            private void OnButtonClick(object sender, RoutedEventArgs e)
            {
                IsTextVisible = !IsTextVisible;
            }
        }
    }
    Le WIP de The last bastion, mon projet de jeu-vidéo (un TD en 3D)

    Mon portfolio / Ma page fb

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Nikel, parfait, génial ^^

    Merci pour ton aide, la dernière solution marche super bien !

    Bon week !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XAML] BlurEffect & Trigger
    Par NeoKript dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 10/02/2012, 16h07
  2. Problème trigger XAML
    Par Xxbz3 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 30/11/2010, 18h34
  3. [power designer et Sybase] trigger
    Par mr_qno dans le forum Sybase
    Réponses: 4
    Dernier message: 12/07/2006, 18h32
  4. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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