2009-09-25 6 views
2

Est-ce que WinForms prend en charge cette fonctionnalité? Disons que je veux montrer un panneau contenant ListView fait de certains résultats. Il est montré en cliquant sur un bouton dans un coin de formulaire, et le panneau est montré à l'intérieur du formulaire, au-dessus de tous les contrôles, de préférence avec une ombre à l'arrière pour le rendre plus attrayant.Panneau de contrôle sur le contenu dans le formulaire

Je veux que ce panneau soit toujours à l'intérieur du formulaire, en tant que partie de celui-ci. Une solution qui me vient à l'esprit est de créer un formulaire sans bordure avec ce panneau, et de le rendre en phase avec la forme originale.

Y at-il peut-être un autre moyen qui me manque?

Répondre

4

Voici une méthode grossière qui va vous aider à démarrer:

public Panel CreateFloatingPanel(Panel originalPanel) 
{ 
    Bitmap bmp = new Bitmap(originalPanel.Width, 
     originalPanel.Height); 
    Rectangle rect = new Rectangle(0, 0, 
     bmp.Width, bmp.Height); 
    originalPanel.DrawToBitmap(bmp, rect); 
    foreach (Control ctrl in originalPanel.Controls) 
    { 
     ctrl.Visible = false; 
    } 
    using (Graphics g = Graphics.FromHwnd(originalPanel.Handle)) 
    { 
     g.DrawImage(bmp, 0, 0); 
     bmp.Dispose(); 
     SolidBrush brush = 
      new SolidBrush(Color.FromArgb(128, Color.Gray)); 
     g.FillRectangle(brush, rect); 
     brush.Dispose(); 
    } 
    Panel floater = new Panel(); 
    floater.Size = originalPanel.Size; 
    floater.Left = originalPanel.Left - 50; 
    floater.Top = originalPanel.Top - 50; 
    this.Controls.Add(floater); 
    floater.BringToFront(); 
    return floater; 
} 

Cette méthode prend un panneau avec des contrôles sur elle, tire le panneau avec tous ses contrôles sur un bitmap temporaire, fait tous les contrôles invisibles, dessine le bitmap temporaire sur le panneau, puis ajoute un calque gris semi-transparent sur le panneau. La méthode crée ensuite un nouveau panneau et le fait flotter sur le panneau d'origine, au-dessus et vers la gauche, puis le renvoie. Cela fait essentiellement du nouveau panneau une sorte de fenêtre contextuelle modale, un peu comme les pages Web le font parfois.

Pour utiliser sur votre formulaire, mettez toutes les commandes que vous voulez être grisés sous sur un panneau, alors l'événement Click de votre bouton faire quelque chose comme ceci:

Panel floater = CreateFloatingPanel(panel1); 
floater.BackColor = Color.White; 
ListView lv = new ListView(); 
floater.Controls.Add(lv); 

Pour annuler l'effet, vous devez simplement supprimer le panneau flottant de la collection Controls du formulaire, puis rendre visible à nouveau tous les contrôles du panneau d'origine, puis Actualiser ou Invalider le panneau pour supprimer les éléments grisés. Le simple Invalidate fonctionnera parce que l'effet grisé ne persiste pas - pour que vous deviez rendre cela un peu plus compliqué. Mais cela devrait vous aider à démarrer, au moins.

2

Pourriez-vous simplement créer un panneau caché à l'arrière du formulaire, puis le rendre visible, puis l'amener à l'avant?

+0

Pas besoin de l'avoir à l'arrière, puis de l'amener à l'avant ... il suffit de basculer sa visibilité. – JustLoren

+0

Pas vraiment ce que je veux ... :( –

Questions connexes