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

Silverlight Discussion :

Synchroniser deux ScrollViewer !


Sujet :

Silverlight

  1. #1
    Invité
    Invité(e)
    Par défaut Synchroniser deux ScrollViewer !
    Salut,

    Mon problème est le suivant :

    J'ai deux ScrollViewer avec des contenus pouvant être identiques ou différents différents.

    Ce que je veux c'est synchroniser la position verticale de l'un des ScrollViewer avec la position Verticale de l'autre. Mes recherches m'ont permis de savoir qu'il y a la proprieté VerticalOffset qui permet de savoir le décalage vertical du contenu défilé. Le problème c'est cette proprieté n'est pas une DP.

    Quelqu'un aurait-il une solution à me proposer ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Le problème c'est cette proprieté n'est pas une DP.
    Euh... t'es sûr ??

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Euh... t'es sûr ??
    Mais elle n'apparait pas dans l'intellisense de mon fichier XAML alors tous les autres y sont listées..
    Pas compris

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je viens de le réverifier. Je pense le problème vient du fait que la proprieté VerticalOffset est en lecture seule. c'est peut être à cause de ça qu'elle n'est pas listée bien qu'elle soit une dependency property.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Je viens de le réverifier. Je pense le problème vient du fait que la proprieté VerticalOffset est en lecture seule. c'est peut être à cause de ça qu'elle n'est pas listée bien qu'elle soit une dependency property.
    Ah oui tiens, j'avais pas vu... Par contre le fait que ce soit une dependency property n'entre pas en ligne de compte, n'importe quelle propriété peut être définie en XAML... sauf si elle est en lecture seule bien sûr

    De toutes façons tu dois pouvoir gérer ça en code-behind... par contre je ne vois aucun évènement de ScrollViewer pour être notifié quand le VerticalOffset change

    EDIT : ah si, en fait il faut utiliser l'évènement Scroll de la classe ScrollBar :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            <ScrollViewer Name="scrollViewerLeft"
                          Grid.Column="0"
                          ScrollBar.Scroll="scrollViewerLeft_Scroll">
                ...
            </ScrollViewer>
     
            <ScrollViewer Name="scrollViewerRight"
                          Grid.Column="1"
                          ScrollBar.Scroll="scrollViewerRight_Scroll">
                ...
            </ScrollViewer>

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            private void scrollViewerLeft_Scroll(object sender, ScrollEventArgs e)
            {
                if (GetOrientation(e) == Orientation.Vertical)
                {
                    scrollViewerRight.ScrollToVerticalOffset(e.NewValue);
                }
            }
     
            private void scrollViewerRight_Scroll(object sender, ScrollEventArgs e)
            {
                if (GetOrientation(e) == Orientation.Vertical)
                {
                    scrollViewerLeft.ScrollToVerticalOffset(e.NewValue);
                }
            }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Allez, pendant que j'y suis... avec une petite propriété attachée, ce sera tout de suite plus propre

    Code C# : 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
        public static class ScrollHelper
        {
            private static Dictionary<string, List<ScrollViewer>> _scrollViewers = new Dictionary<string,List<ScrollViewer>>();
     
     
            public static string GetScrollGroup(ScrollViewer scrollViewer)
            {
                return (string)scrollViewer.GetValue(ScrollGroupProperty);
            }
     
            public static void SetScrollGroup(ScrollViewer scrollViewer, string value)
            {
                scrollViewer.SetValue(ScrollGroupProperty, value);
            }
     
            // Using a DependencyProperty as the backing store for ScrollGroup.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty ScrollGroupProperty =
                DependencyProperty.RegisterAttached("ScrollGroup", typeof(string), typeof(ScrollHelper), new UIPropertyMetadata(null, ScrollGroupChanged));
     
            private static void ScrollGroupChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                ScrollViewer scv = o as ScrollViewer;
                if (o != null)
                {
                    string oldGroup = e.OldValue as string;
                    string newGroup = e.NewValue as string;
     
                    if (oldGroup != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (_scrollViewers.TryGetValue(oldGroup, out groupMembers))
                        {
                            groupMembers.Remove(scv);
                        }
                        scv.RemoveHandler(ScrollBar.ScrollEvent, _scrollHandler);
                    }
     
                    if (newGroup != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (!_scrollViewers.TryGetValue(newGroup, out groupMembers))
                        {
                            groupMembers = new List<ScrollViewer>();
                            _scrollViewers.Add(newGroup, groupMembers);
                        }
                        groupMembers.Add(scv);
                        scv.AddHandler(ScrollBar.ScrollEvent, _scrollHandler);
                    }
                }
            }
     
            private static ScrollEventHandler _scrollHandler = new ScrollEventHandler(scv_Scroll);
     
            private static void scv_Scroll(object sender, ScrollEventArgs e)
            {
                ScrollViewer scv = sender as ScrollViewer;
                ScrollBar scb = e.OriginalSource as ScrollBar;
                if (scv != null && scb != null)
                {
                    string group = GetScrollGroup(scv);
                    if (group != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (_scrollViewers.TryGetValue(group, out groupMembers))
                        {
                            foreach (var s in groupMembers)
                            {
                                if (object.ReferenceEquals(s, scv))
                                    continue;
     
                                if (scb.Orientation == Orientation.Horizontal)
                                {
                                    s.ScrollToHorizontalOffset(e.NewValue);
                                }
                                else
                                {
                                    s.ScrollToVerticalOffset(e.NewValue);
                                }
                            }
                        }
                    }
                }
            }
     
        }

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            <ScrollViewer Name="scrollViewerLeft"
                          Grid.Column="0"
                          my:ScrollHelper.ScrollGroup="toto">
                ...
            </ScrollViewer>
     
            <ScrollViewer Name="scrollViewerRight"
                          Grid.Column="1"
                          my:ScrollHelper.ScrollGroup="toto">
                ...
            </ScrollViewer>

    (j'aime pas être obligé d'utiliser du code behind )

    Au cas où ce serait pas clair : pour synchroniser 2 ScrollViewers, il suffit de leur donner la même valeur de ScrollHelper.ScrollGroup

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Allez, pendant que j'y suis... avec une petite propriété attachée, ce sera tout de suite plus propre
    Ca ressemble à du Silverlight, ça a le gout du Silverlight mais ça marche po en Silverlight

    ScrollBar.ScrollEvent ça existe po en SL.

    Et pour la solution d'avant

    ScrollBar.Scroll="scrollViewerLeft_Scroll"

    On n'a pas ça non plus en SL...

    Y'a pas moyen de gérer l'event Scroll en natif. Il y a quelques hacks, comme récupérer les ScrollBar à coup de VisualTreeHelper sur le ScrollViewer.

    Après faudrait donc adapter ton/tes code(s) si possible.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    Ca ressemble à du Silverlight, ça a le gout du Silverlight mais ça marche po en Silverlight
    Argh... effectivement j'ai testé ça en WPF. Je me dis toujours qu'il faudrait que je me mette à Silverlight, mais plus ça va, plus je vois les innombrables limitations, et moins j'ai envie de m'y mettre

    M'en fous, ce bout de code me resservira sûrement un jour

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Voila une solution pour récupérer la Scrollbar et son event Scroll:

    http://forums.silverlight.net/forums/t/53934.aspx

    La solution proposée par Olav me semble la plus adaptée

  10. #10
    Invité
    Invité(e)
    Par défaut
    Excusez moi du retard de ma réaction.

    Je vois j'ai eu pas mal d'aide.

    Citation Envoyé par tomlev
    Par contre le fait que ce soit une dependency property n'entre pas en ligne de compte, n'importe quelle propriété peut être définie en XAML
    . OK.

    Je vois que tomlev m'a proposé un truc sympa qu'il a ensuite peaufiner en AttachedProperty mais malheureusement c'est du WPF. Merci à Skyounet d'avoir tester cela à ma place. Bref je note que pour l'instant c'est possible en WPF.

    Pour l'instant je vais visiter le lien proposer par thomas.
    http://forums.silverlight.net/forums/t/53934.aspx

  11. #11
    Invité
    Invité(e)
    Par défaut
    Le lien proposer par Thomas est intéressant. La discussion propose d'utiliser ce que Skyounet m'a déjà proposer c'est à dire :
    récupérer les ScrollBar à coup de VisualTreeHelper sur le ScrollViewer.
    .

    Mais il me semble, après lecture du lien de thomas, qu'il n'est peut récupérer aucun des constituant du ScrollViewer.

    Bon je vais tester et voir ce que cela donne. Dans tous les cas je crois que ce ne sera pas très propre pour le MVVM non ?

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Mais il me semble, après lecture du lien de thomas, qu'il n'est peut récupérer aucun des constituant du ScrollViewer.
    Si si, on peut... Voilà une version modifiée de ma propriété attachée, qui marche avec SL :

    Code C# : 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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
        public static class ScrollHelper
        {
            private static Dictionary<string, List<ScrollViewer>> _scrollViewers = new Dictionary<string, List<ScrollViewer>>();
     
     
            public static string GetScrollGroup(ScrollViewer scrollViewer)
            {
                return (string)scrollViewer.GetValue(ScrollGroupProperty);
            }
     
            public static void SetScrollGroup(ScrollViewer scrollViewer, string value)
            {
                scrollViewer.SetValue(ScrollGroupProperty, value);
            }
     
            // Using a DependencyProperty as the backing store for ScrollGroup.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty ScrollGroupProperty =
                DependencyProperty.RegisterAttached("ScrollGroup", typeof(string), typeof(ScrollHelper), new PropertyMetadata(null, ScrollGroupChanged));
     
            private static void ScrollGroupChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                ScrollViewer scv = o as ScrollViewer;
                if (o != null)
                {
                    string oldGroup = e.OldValue as string;
                    string newGroup = e.NewValue as string;
     
                    if (oldGroup != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (_scrollViewers.TryGetValue(oldGroup, out groupMembers))
                        {
                            groupMembers.Remove(scv);
                        }
                        DetachScrollEvents(scv);
                    }
     
                    if (newGroup != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (!_scrollViewers.TryGetValue(newGroup, out groupMembers))
                        {
                            groupMembers = new List<ScrollViewer>();
                            _scrollViewers.Add(newGroup, groupMembers);
                        }
                        groupMembers.Add(scv);
                        if (Application.Current.Host.IsLoaded)
                        {
                            AttachScrollEvents(scv);
                        }
                        else
                        {
                            scv.Loaded += new RoutedEventHandler(scv_Loaded);
                        }
                    }
                }
            }
     
            static void scv_Loaded(object sender, RoutedEventArgs e)
            {
                ScrollViewer scv = sender as ScrollViewer;
                if (scv != null)
                {
                    scv.ApplyTemplate();
                    scv.Loaded -= scv_Loaded;
                    AttachScrollEvents(scv);
                }
            }
     
            private static void DetachScrollEvents(ScrollViewer scv)
            {
                ScrollBar vert = GetScrollBar(scv, "VerticalScrollBar");
                ScrollBar horz = GetScrollBar(scv, "HorizontalScrollBar");
                if (vert != null)
                    vert.Scroll -= scv_Scroll;
                if (horz != null)
                    horz.Scroll -= scv_Scroll;
            }
     
            private static void AttachScrollEvents(ScrollViewer scv)
            {
                ScrollBar vert = GetScrollBar(scv, "VerticalScrollBar");
                ScrollBar horz = GetScrollBar(scv, "HorizontalScrollBar");
                if (vert != null)
                    vert.Scroll += scv_Scroll;
                if (horz != null)
                    horz.Scroll += scv_Scroll;
            }
     
            private static ScrollBar GetScrollBar(ScrollViewer scv, string scrollBarName)
            {
                var firstChild = VisualTreeHelper.GetChild(scv, 0) as FrameworkElement;
                if (firstChild != null)
                {
                    return firstChild.FindName(scrollBarName) as ScrollBar;
                }
                return null;
            }
     
            private static void scv_Scroll(object sender, ScrollEventArgs e)
            {
                ScrollBar scb = e.OriginalSource as ScrollBar;
                ScrollViewer scv = FindParent<ScrollViewer>(scb);
                if (scv != null && scb != null)
                {
                    string group = GetScrollGroup(scv);
                    if (group != null)
                    {
                        List<ScrollViewer> groupMembers = null;
                        if (_scrollViewers.TryGetValue(group, out groupMembers))
                        {
                            foreach (var s in groupMembers)
                            {
                                if (object.ReferenceEquals(s, scv))
                                    continue;
     
                                if (scb.Orientation == Orientation.Horizontal)
                                {
                                    s.ScrollToHorizontalOffset(e.NewValue);
                                }
                                else
                                {
                                    s.ScrollToVerticalOffset(e.NewValue);
                                }
                            }
                        }
                    }
                }
            }
     
            private static T FindParent<T>(DependencyObject o) where T : DependencyObject
            {
                DependencyObject tmp = o;
                while (tmp != null && !(tmp is T))
                {
                    tmp = VisualTreeHelper.GetParent(tmp);
                }
                return tmp as T;
            }
     
        }

    C'est quand même un peu plus galère qu'avec WPF

  13. #13
    Invité
    Invité(e)
    Par défaut
    Résoluuuuuuuuuuuuuuuuuuu..


    Merci à tout le monde et surtout à tomlev.

    Ben il va falloir que je regarde comment t'as fait.

    Encore Merci

  14. #14
    Invité
    Invité(e)
    Par défaut
    Au fait, il y a un p'tit problème qui provient de mon côté.

    J'ai teste ta classe Scrollhelper et elle merche à merveille. Mais j'ai voulu la transférer sur mon projet MVVM.

    J'ai appliqué la proprieté attachée sur deux scrollviewer d'un TemplatedControl. Mais cela m'engendre une erreur d'exécution dans la méthode GetScrollBar.

    L'erreur affichée est la suivante :
    An exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.dll but was not handled in user code

    Additional information: L'argument spécifié n'était pas dans les limites de la plage de valeurs valides.
    Cette est déclenchée par l'instrcution VisualTreeHelper.GetChild(scv, 0).

    Un ArgumentOutOfRangeException entraine que mon ScrollViewer ne contient pas d'éléments parce que le deuxième paramètre passé est 0 qui est la valeur minimale à ce que je pense.

    Quelqu'un a-t-il une idée sur le problème.

    Il faut noter que mes ScrollViewer sont définis dans le fichier generic.xaml qui contient le thème d'un TemplatedControl.

    Merci.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Argh... c'est parce que le contenu du ScrollViewer n'est pas encore chargé à ce stade je pense... J'avais pris des précautions par rapport à ça, mais il y a peut-être un truc particulier dans le cas d'un template. Je tâcherai de regarder ça quand j'aurai un moment...

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Argh... c'est parce que le contenu du ScrollViewer n'est pas encore chargé à ce stade je pense...
    je ne pense pas que ce soit à l'origine du problème du fait j'ai essayé d'attaché ton AttachedProperty dans le code dans la méthode redéfinie OnApplyTemplate.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    je ne pense pas que ce soit à l'origine du problème du fait j'ai essayé d'attaché ton AttachedProperty dans le code dans la méthode redéfinie OnApplyTemplate.
    ah... essaie de le faire à la fin de cette méthode alors, après avoir appelé base.OnApplyTemplate

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    ah... essaie de le faire à la fin de cette méthode alors, après avoir appelé base.OnApplyTemplate
    Appliquer mais ça ne marche.

    C'est après l'avoir placé dans le gestionnaire de l'évènement Loaded de mon TemplatedControl que ça finalement marché. T'avais raison sur le chargement des ScrollViewer.

    Encore Merci.

  19. #19
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Appliquer mais ça ne marche.

    C'est après l'avoir placé dans le gestionnaire de l'évènement Loaded de mon TemplatedControl que ça finalement marché. T'avais raison sur le chargement des ScrollViewer.
    Normal: dans le OnApplyTemplate, le template n'est pas encore chargé (il est en cours de chargement) donc si tu essayes d'accéder à l'un des éléments de ce template => erreur.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Normal: dans le OnApplyTemplate, le template n'est pas encore chargé (il est en cours de chargement) donc si tu essayes d'accéder à l'un des éléments de ce template => erreur.
    En fait, en suivant le lien que tu as donné, je suis tombé sur un autre lien qui explique le fonctionnement. En gros, dans l'évènement Loaded du contrôle, le contenu n'est pas forcément déjà chargé, mais tu peux appeler ApplyTemplate puis accéder au visual tree du contrôle

Discussions similaires

  1. Synchronisation deux Bases Mysql
    Par eric_89 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/12/2006, 15h57
  2. Comment synchroniser deux bases de données
    Par apoingsfermes dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/11/2006, 22h41
  3. Synchroniser deux zones de listes en VBA
    Par gaelj dans le forum Access
    Réponses: 3
    Dernier message: 03/09/2006, 19h55
  4. Synchroniser deux listes
    Par Mahefasoa dans le forum Access
    Réponses: 4
    Dernier message: 02/08/2006, 10h31
  5. Synchroniser deux CPU (deux algos)
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 28/04/2006, 14h46

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