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 :

Ajouter des Canvas dans un DockPanel sans superposition


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut Ajouter des Canvas dans un DockPanel sans superposition
    Bien le bonjour

    Ma question va sans doute paraitre simpliste; mais je ne parviens pas à trouver une solution (peut-être que je n'ai pas recherché avec les bons mots clé ? dans ce cas je suis désolée!)

    Dans mon application WPF, j'ai besoin, par le code, d'ajouter des Canvas au sein de différents DockPanel.
    je fais donc, en gros, _myDockPanel.Children.Add(_myCanvas).

    Le problème c'est que tous les Canvas se superposent, ils sont tous les uns sur les autres, coincés dans le coin supérieur gauche (je le vois car ils contiennent des TextBlock ou des Button ^^)

    Any ideas ?

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Le conteneur DockPanel permet de "réorganiser des éléments enfants soit horizontalement soit verticalement, l'un par rapport à l'autre." (cf msdn)

    Si c'est bien ce conteneur que tu souhaites utiliser, tu peux placer (par le code) tes contrôles au sein du DockPanel de cette manière :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    DockPanel.SetDock(myCanvas, Dock.Left);
    où myCanvas est un de tes canvas

  3. #3
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    Malheureusement cela ne fonctionne pas, mes trois boutons contenus chacun dans un Canvas sont toujours superposés : je ne vois que le dernier.

    J'ai essayé de cette manière :

    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
     
    Canvas c1 = new Canvas();
    Canvas c2 = new Canvas();
    Canvas c3 = new Canvas();
    Button b1 = new Button();
    b1.Content = "1";
    Button b2 = new Button();
    b2.Content = "2";
    Button b3 = new Button();
    b3.Content = "3";
    c1.Children.Add(b1);
    c2.Children.Add(b2);
    c3.Children.Add(b3);
    DockPanel.SetDock(c1, Dock.Top);
    DockPanel.SetDock(c2, Dock.Left);
    DockPanel.SetDock(c3, Dock.Right);
    mainDock.Children.Add(c1);
    mainDock.Children.Add(c2);
    mainDock.Children.Add(c3);
    Si je ne met pas le mainDock.Children.Add, les controles n'apparaissent pas (normal ).

    Et à l'exécution, je ne vois que le bouton "3"

    Ce bout de code n'est qu'un test; dans la pratique je ne peux pas savoir combien d'éléments seront ajoutés dans le DockPanel.
    J'ai le même problème en essayant de mettre un Canvas dans un StackPanel; si j'enlève le Canvas, je n'ai pas de problème

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Le Canvas est un peu particulier. Il faut lui définir ses dimensions car il ne va pas prendre automatiquement la taille de ses fils. Un exemple :

    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
          Canvas c1 = new Canvas();
          c1.Height = c1.Width = 100.0;
          c1.Background = Brushes.Red;
          c1.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
          c1.VerticalAlignment = System.Windows.VerticalAlignment.Top;
          Canvas c2 = new Canvas();
          c2.Height = c2.Width = 100.0;
          c2.Background = Brushes.Yellow;
          c2.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
          c2.VerticalAlignment = System.Windows.VerticalAlignment.Top;
          Canvas c3 = new Canvas();
          c3.Height = c3.Width = 100.0;
          c3.Background = Brushes.Blue;
          c3.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
          c3.VerticalAlignment = System.Windows.VerticalAlignment.Top;
          Button b1 = new Button();
          b1.Content = "1";
          Button b2 = new Button();
          b2.Content = "2";
          Button b3 = new Button();
          b3.Content = "3";
          c1.Children.Add(b1);
          c2.Children.Add(b2);
          c3.Children.Add(b3);
          DockPanel.SetDock(c1, Dock.Top);
          DockPanel.SetDock(c2, Dock.Left);
          DockPanel.SetDock(c3, Dock.Right);
          mainDock.Children.Add(c1);
          mainDock.Children.Add(c2);
          mainDock.Children.Add(c3);

  5. #5
    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 alucia

    Comme dit par Benoit il faut definir une taille pour canvas mais comme en general on n'as idee de la bonne taille à l'avance on peut aussi
    -specifier des "bornes" (MinWidth ou MaxWidth)
    -aussi l'ordre de stacking(le premier element ajouter en haut alors que par defaut il est le plus bas,car son ZIndex=0).......

    code:
    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
    42
    43
    44
    45
    46
    47
    48
     
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
     
    namespace WpfDockingCanvas
    {
        /// <summary>
        /// Logique d'interaction pour Window2.xaml
        /// </summary>
        public partial class Window2 : Window
        {
            public Window2()
            {
                InitializeComponent();
            }
     
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
               // dernier element ajuste en fonction d'espace restant
                mainDock.LastChildFill = true; 
                for (int i = 0; i < 10; i++)
                {
     
     
     
                    Button b = new Button();
                    b.Name = "b" + (i + 1).ToString();
                    b.Content = "b" + (i + 1).ToString();
                    Canvas c = new Canvas();
                    c.Name = "c" + (i + 1).ToString();
                    c.Children.Add(b);
                    c.MinHeight = 50;
                    c.MinWidth = 50;
     
                    DockPanel.SetDock(c, Dock.Top);
                    mainDock.Children.Add(c);
                    //revert ZIndex
                    DockPanel.SetZIndex(c, 9-i);
                }
            }
        }
    }
    bon code..................

  6. #6
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    Merci de votre aide

    Par contre je ne comprends pas bien le fonctionnement de ZIndex

  7. #7
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Points : 152
    Points
    152
    Par défaut
    Z-Index gère la profondeur de tes contrôles.

    Dans le cas ou tu as 2 rectangles qui se superposent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rect1 : ZIndex = 10
    rect2 : ZIndex = 25
    Au niveau de l'affichage, rect2 sera affiché par dessus rect1 car sa valeur est plus grande. C'est comme les calques sur Photoshop par exemple

    PS: Dans le cas où tu ne le renseigne pas, c'est le dernier élément ajouté à l'arbre visuel qui passe par dessus.

  8. #8
    Membre régulier
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Points : 119
    Points
    119
    Par défaut
    Merci pour ces précisions

    Problème résolu ^^

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/12/2014, 15h20
  2. Comment ajouter des règles dans Snort sans l'interrompre
    Par linkragus dans le forum Sécurité
    Réponses: 0
    Dernier message: 18/04/2012, 16h00
  3. Ajouter des classes dans un namespace sans recompiler
    Par Lackap dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 02/07/2010, 09h56
  4. Ajouter des enregistrements dans BDD sans Access installé
    Par bibilolo2 dans le forum Général VBA
    Réponses: 2
    Dernier message: 11/06/2009, 13h27
  5. Réponses: 4
    Dernier message: 14/05/2007, 11h50

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