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.
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;
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);
}
}
tabControl1.Appearance = TabAppearance.FlatButtons;
tabControl1.ItemSize = new Size(0, 1);
tabControl1.SizeMode = TabSizeMode.Fixed;
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.
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 #
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).
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).
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.
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.
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é ItemSize
Width
de TablessControl à un nombre inférieur afin de réduire la largeur de chaque onglet. N'hésitez pas également à ajuster la propriété ItemSize
Height
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.
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)
);
Où tcActionControls
est votre TabControl
et tbPageToShow
est une TabPage
à afficher à ce moment précis.
Devrait travailler pour vous.
Cordialement.
Vous pouvez essayer de supprimer TabPage de TabPageCollection:
TabControl.TabPageCollection tabCol = tabControl1.TabPages;
foreach (TabPage tp in tabCol)
{
if(condition)
{
tabCol.Remove(tp);
}
}
Cette solution semble bien fonctionner - Comment masquer les onglets dans le contrôle d’onglet?
Insérez Tabcontrol dans un formulaire, le nom par défaut étant tabcontrol1.
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!