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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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