web-dev-qa-db-fra.com

Masquer l'en-tête d'onglet sur C # TabControl

Je développe une application Windows Form avec plusieurs pages. J'utilise un TabControl pour implémenter cela. Au lieu d'utiliser l'en-tête pour basculer entre les onglets, je souhaite que mon application contrôle cela, par exemple. l'onglet suivant devrait s'ouvrir après que l'utilisateur a rempli une zone de texte et cliqué sur le bouton suivant.

42
Hossein Mobasher

Vous pouvez remplacer tabcontrol par un panneau fait à la main qui imite comme vous le souhaitez:

class MultiPagePanel : Panel
{
  private int _currentPageIndex;
  public int CurrentPageIndex
  {
    get { return _currentPageIndex; }
    set
    {
      if (value >= 0 && value < Controls.Count)
      {
        Controls[value].BringToFront();
        _currentPageIndex = value;
      }
    }
  }

  public void AddPage(Control page)
  {
    Controls.Add(page);
    page.Dock = DockStyle.Fill;
  }
}

Et puis ajoutez des pages et définissez la page visible actuelle:

MultiPagePanel p;

// MyTabPage is a Control derived class that represents one page on your form.
MyTabPage page = new MyTabPage(); 
p.AddPage(page);

p.CurrentPageIndex = 0;
13

Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Déposez le nouveau contrôle du haut de la boîte à outils sur votre formulaire. Il affiche les onglets au moment de la conception afin que vous puissiez facilement basculer entre eux lors de la conception. Ils sont masqués à l'exécution. Utilisez la propriété SelectedTab ou SelectedIndex dans votre code pour changer de page.

using System;
using System.Windows.Forms;

public class TablessControl : TabControl {
  protected override void WndProc(ref Message m) {
    // Hide tabs by trapping the TCM_ADJUSTRECT message
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1;
    else base.WndProc(ref m);
  }
}
94
Hans Passant
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
20
Geograph

Créez un nouveau UserControl, nommez-le par exemple TabControlWithoutHeader et changez UserControl hérité en TabControl et ajoutez du code. Le code de résultat devrait ressembler à:

public partial class TabControlWithoutHeader: TabControl
{
    public TabControlWithoutHeader()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
    if (m.Msg == 0x1328 && !DesignMode)
        m.Result = (IntPtr)1;
    else
        base.WndProc(ref m);
    }
}

Après la compilation, vous aurez le contrôle TabControlWithoutHeader dans ToolBox. Déposez-le sur le formulaire, dans le concepteur, vous verrez les en-têtes, mais au moment de leur exécution, ils seront masqués. Si vous souhaitez également les masquer dans Designer, supprimez && !DesignMode.

J'espère que cela pourra aider.

http://social.msdn.Microsoft.com/Forums/windows/en-US/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/tabs-in-winform?forum=winforms

16
Reniuz

J'avais besoin de ce code mais dans VB.net, je l'ai donc converti. Si quelqu'un a besoin de ce code dans VB.Net, c'est qu'il

Imports System
Imports System.Windows.Forms

Public Class TablessControl
           Inherits System.Windows.Forms.TabControl

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        ' Hide tabs by trapping the TCM_ADJUSTRECT message
        If (m.Msg = Convert.ToInt32("0x1328", 16) And Not DesignMode) Then
            m.Result = CType(1, IntPtr)
        Else
            MyBase.WndProc(m)
        End If
    End Sub

End Class

et merci à @Hans Passant pour la réponse en C #

9
abottoni

Pour compléter la réponse existante de Hans Passant, j'ai trouvé quatre façons de masquer les flèches à l'utilisateur lorsque le nombre d'onglets dépasse la largeur du TablessControl. Aucune solution unique n'est nécessairement parfaite pour tout le monde, mais peut l'être pour vous (ou du moins une combinaison des deux).

Solution 1:

Activez simplement Multiline. Cela empêchera les flèches d'apparaître en premier lieu. Cependant, gardez à l'esprit que vous risquez de perdre WYSIWYG dans le concepteur car l'espace vertical sera ajusté verticalement vers le bas et que les contrôles de TablessControl peuvent même être «coupés» au bas (encore une fois, en mode développeur uniquement).

Solution 2:

Une solution plus avancée qui résout le problème WYSIWYG ci-dessus consiste à n'activer que Multiline une fois que le programme est exécuté. Ajoutez simplement ce constructeur à la classe TablessControl:

public TablessControl()
{
    bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
    if (!designMode) Multiline = true;      
}

Pour le développeur, ils apparaîtront toujours sous la forme d'une seule ligne d'onglets.

Solution 3:

Diminuez la taille de la police du TablessControl. Chaque onglet doit être réduit en conséquence. Étant donné que l'utilisateur ne voit jamais les onglets, cela ne devrait pas avoir beaucoup d'importance si vous définissez une taille de police de 4 pt.

Attention toutefois, le contenu du TablessControl peut également être redimensionné. Si cela se produit, modifiez à nouveau la taille de la police pour chaque widget à l'intérieur. Ils resteront heureusement à cette taille même si vous décidez de modifier à nouveau la taille de la police de TablessControl principale.

Cette approche présente également l’avantage d’indiquer plus précisément au développeur les véritables propriétés verticales WYSIWYG (ce qui peut sembler intéressant pour l’utilisateur, mais peut être légèrement coupé en bas dans le concepteur en raison de la hauteur des onglets).

Cette solution peut être combinée avec les solutions 1 et 2 pour des avantages cumulés.

Solution 4:

Cette solution n’est pas forcément aussi géniale si l’un des onglets a un texte long. Merci à Hans de l'avoir suggéré.

Tout d'abord, définissez la variable SizeMode de TablessControl sur 'Fixe', puis réduisez la propriété ItemSizeWidth de TablessControl à un nombre inférieur afin de réduire la largeur de chaque onglet. N'hésitez pas également à ajuster la propriété ItemSizeHeight pour résoudre le problème WYSIWYG susmentionné, bien que la solution 3 puisse s'avérer plus utile pour résoudre ce problème.

Cette solution peut être combinée avec les solutions ci-dessus pour accumuler davantage d'avantages.

6
Dan W

Si vous voulez {vraiment} _, vous pouvez faire quelque chose comme ça 

 tcActionControls.Region = new Region(new RectangleF(
             tbPageToShow.Left, 
               tbPageToShow.Top, 
                 tbPageToShow.Width, 
                    tbPageToShow.Height)
);

tcActionControls est votre TabControl et tbPageToShow est une TabPage à afficher à ce moment précis. 

Devrait travailler pour vous.

Cordialement.

4
Tigran

Vous pouvez essayer de supprimer TabPage de TabPageCollection:

TabControl.TabPageCollection tabCol = tabControl1.TabPages;

        foreach (TabPage tp in tabCol)
        {
           if(condition)
            { 
              tabCol.Remove(tp);
            }
        }
1
marz

Cette solution semble bien fonctionner - Comment masquer les onglets dans le contrôle d’onglet?

  1. Insérez Tabcontrol dans un formulaire, le nom par défaut étant tabcontrol1.

  2. Assurez-vous que tabcontrol1 est sélectionné dans le volet Propriétés de visual studio et modifiez les propriétés suivantes:

    une. Définir l'apparence sur les boutons

    b. Définissez ItemSize 0 pour Width et 1 pour Height

    c. Définissez Multiline sur True

    ré. Définir SizeMode sur Fixed

Ceci est mieux réalisé lorsque vous avez terminé vos tâches de conception, car elles sont également masquées par le concepteur, ce qui rend la navigation difficile!

0
Adrian Brown