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 :

Encapsulation et taille dynamique pour utiliser un ScrollViewer


Sujet :

Silverlight

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut Encapsulation et taille dynamique pour utiliser un ScrollViewer
    Bonjour à tous,

    J'ai vu plusieurs sujets sur le forum qui traitaient du problème mais j'ai pas réussi à résoudre le miens à l'aide des réponses. Je me permet donc de venir grossir le nombre de sujet avec mes petites histoires .

    Voilà l'idée général :
    Je créer un arbre de décision d'après une base de donnée dans un canvas.
    Il y a plusieurs modèle possible donc le tout dois être dynamique.
    L'utilisateur choisit le modèle puis le canvas se remplit des objets et ils sont positionnés sur le canvas qui "grandit" en fonction.
    Le problème arrive donc au moment ou les objet sortent de l'espace alloué au canvas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      <Grid x:Name="LayoutRoot">
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="Menu" Width="Auto" />
                <ColumnDefinition x:Name="Contenu" Width="*" />
            </Grid.ColumnDefinitions>
    //[...] Bout de code qui concerne la partie Menu de la grid
            <ScrollViewer x:Name="rootScroll" Grid.Column="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                <Border x:Name="rootBorder">
                    <Canvas x:Name="rootCanvas"/>
                </Border>
            </ScrollViewer>
        </Grid>
    Du coup j'essaie de faire un truc comme ça, en me disant que le border encapsulera le canvas qui lui fournira une taille qui du coup permettra au ScrollViewer de déterminer si oui ou non il appliquera les ascenseurs.

    Mais au moment de l'initialisation, si j'ai bien compris, la taille est nulle donc pas de barre.

    Alors dans le Code Behind après avoir remplit mon canvas j'ai essayé de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    rootCanvas.Width = rootCanvas.ActualWidth;
    rootCanvas.Height = rootCanvas.ActualHeight;
    rootBorder.Height = rootCanvas.Height;
    rootBorder.Width = rootCanvas.Width;
    Mais sans effet étant donné que je ne vois pas comment faire comprendre au ScrollViewer qu'il y a eu du changement et qu'il doit éventuellement créer des barres

    Est ce que je fais fausse route ? Est ce que les tailles des objets encapsulés sont elles bien prise en compte ? Y a une solution à mon problème sans imposer une taille fixe au canvas ?

    Merci

    Valorn

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Je sais pas repondre à la question, mais je me pose une question :
    tu tentes de mettre la taille du canvas à son maximum, à quoi servent alors les scrolls ?
    Le but n'etant pas justement d'avoir une taille maximal, et si ca dépasse, alors les scrolls apparaissent?
    Peut être qu'en prenant le problème a l'envers :
    -donner une taille fixe dans le xaml (qui est le maximum)
    -calculer la hauteur total des items à ajouter
    -reduire la taille du canvas si inferieur
    -ajouter les éléments

  3. #3
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Le canvas ne possède que la taille que l'on lui assigne à la différence des panels qui gèrent la taille de leurs items ou leur propre taille.

    Pour moi tu as deux solutions :

    1°) tu parcours les enfants de ton canvas pour déterminer le rectangle dans lequel il se trouve et tu retailles le Canvas.

    2°) tu crées un Custom Panel (qui est fait pour ça) et tu détermines le rectangle dans lequel il se trouve dans MeasureOverride et tu les positiones dans ArrangeOverride.

    As-toi de voir

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut
    Merci pour vos remarques/réponses.

    Au sujet des deux solutions que tu me proposes Samoteph :

    1) Je suis d'accord pour le parcours des enfants mais je vois pas comment retailler le Canvas et mettre à jour le ScrollViewer pour qu'il "s'adapte" ?

    2) Je vais me renseigner sur tout ça mais merci. Y a pas de contraintes particulières pour l'ajout des objets ? (je sais que j'avais test plein de panel et le seul qui allait pour insérer mes objets et les placer/déplacer comme je voulais)

    Merci

  5. #5
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    1) Je suis d'accord pour le parcours des enfants mais je vois pas comment retailler le Canvas et mettre à jour le ScrollViewer pour qu'il "s'adapte" ?
    Tu parcours tes enfant pour obteinr le fameux rectangle et tu fixes la taille de ton Canvas avec celui-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rootCanvas.Width = rectChildren.Width;
    rootCanvas.Height = rectChildren.Height;
    Une fois fixé la taille du Canvas le ScrollViewer fonctionnera tout seul. D'ailleurs tu peux tester en fixant la taille de ton Canvas à 1000 par exemple et ton ScrollViewer devrait fonctionner (mais cela ne correspondra pas à la taille de tes enfants bien entendu).

    2) Je vais me renseigner sur tout ça mais merci. Y a pas de contraintes particulières pour l'ajout des objets ? (je sais que j'avais test plein de panel et le seul qui allait pour insérer mes objets et les placer/déplacer comme je voulais)
    Pour créer ton propre Panel tu peux jeter un coup d'oeil ici :

    http://blogs.msdn.com/b/silverlight_...tom-panel.aspx

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut
    Merci pour ces précisions,
    finalement j'ai opté pour la première plus facile à mettre en place pour ce que j'avais déjà codé.

    Maintenant, que je connais la taille ça va peut être être plus simple de gérer l'impossibilité de sortir les objets du cadre.

    Merci encore

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

Discussions similaires

  1. Charger dll dynamique pour utilisation de ses classes
    Par Tehko dans le forum Visual C++
    Réponses: 4
    Dernier message: 14/03/2013, 12h13
  2. Réponses: 2
    Dernier message: 24/09/2011, 14h20
  3. Réponses: 1
    Dernier message: 16/05/2008, 17h53
  4. SQL Dynamique pour listes de taille variable
    Par Tino13 dans le forum SQL
    Réponses: 9
    Dernier message: 24/08/2007, 09h30
  5. Réponses: 39
    Dernier message: 27/03/2007, 20h25

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