2010-04-16 6 views
6

Je travaille sur un projet mettant à jour l'interface utilisateur de l'application WinForms pour être plus cohérent avec les tailles. Les contrôles TextBox et ComboBox ont des hauteurs différentes par défaut, même avec la même police. J'ai été en mesure de redimensionner les zones de texte en désactivant AutoSize, mais le texte garde toujours le haut du contrôle, laissant un espace en dessous.C# WinForms Alignement vertical pour TextBox, etc

Est-il possible de centrer le texte verticalement dans le contrôle?

Répondre

7

Si tu arrêtes AutoSize sur un contrôle, il doit y avoir un Label, puisque TextBox n'a pas une propriété AutoSize. La propriété TextAlign d'un Label est de type ContentAligment, vous pouvez donc définir l'alignement horizontal et vertical.

Pour différentes raisons ennuyeuses, les zones de texte dans les fenêtres sont conçues pour ajuster automatiquement leur hauteur à la police utilisée. Pour contrôler les hauteurs et centrer verticalement le texte, vous pouvez créer rapidement un UserControl personnalisé dans lequel vous pouvez remplacer toutes vos zones de texte.

Sur votre contrôle utilisateur, définissez BorderStyle sur Fixed3D et BackColor sur System.Window. Ajoutez un TextBox et définissez son BorderStyle à Aucun. Dans l'événement Resize pour le contrôle, ajoutez du code qui a la même largeur que la zone client du contrôle utilisateur (représentant les pixels de bordure) et l'aligne à gauche (c'est-à-dire textBox1.Left = 0;) et le centre verticalement (par exemple textBox1.Top = (this.Height - textBox1.Height)/2;). Enfin, ajoutez au contrôle utilisateur toutes les propriétés et les événements de type TextBox dont vous avez besoin (probablement juste Text et TextChanged, je suppose), et branchez-les pour qu'ils passent à la TextBox dans votre contrôle, comme ceci :

public string Text 
{ 
    get 
    { 
     return textBox1.Text; 
    } 
    set 
    { 
     textBox1.Text = value; 
    } 
} 

Si vous voulez obtenir super-fantaisie avec cela, vous pouvez même remplacer la propriété TextAlign de contrôle de votre utilisateur qui est en fait de type ContentAlignment (comme l'étiquette), puis aligner la zone de texte intérieur correspondant.

Cette même approche fonctionnera pour une ComboBox, même si elle semble légèrement étrange. Avec la zone de liste déroulante, vous définissez sa propriété FlatStyle à plat - sinon vous le traitez comme un contrôle TextBox. Il semblera étrange parce que la boîte de flèche de la liste déroulante ne sera pas tout à fait en haut et en bas du panneau.

+5

Juste comme un FYI, il y a en fait une propriété AutoSize sur TextBoxes. Il ne s'affichera simplement pas dans la feuille de propriétés ou ne se terminera pas automatiquement en raison de certaines décorations d'attribut. Mais myTextBox.AutoSize = false; compilera, et mettre cela dans le constructeur d'un contrôle hérité donnera une boîte de texte redimensionnable. – Clyde

+1

Noté.Cela fait des années que je n'ai plus essayé de rendre les commandes de Windows différentes de la norme, alors je suis un peu rouillé. Il est intéressant que l'Intellisense dise "Cette propriété n'est pas pertinente pour cette classe", même si elle est évidemment * est * (la mettre à false rend la hauteur ajustable). – MusiGenesis

+0

Je suppose que la réponse la plus facile est: passer à WPF. Tout a une propriété VerticalContentAlignment et une propriété HorizontalContentAlignment. – MusiGenesis

1

un peu en retard mais voici la réponse facile ..

créer un contrôle vide et inclure votre zone de texte comme un enfant, alors quand le contrôle parent ou la zone de texte redimensionnent réaligner votre contrôle TextBox au milieu verticalement

supprime les bordures, rends le bk de la même couleur que le parent (par défaut)

oh, remplacez la police pour définir la police de la zone de texte et je pense que vous avez votre zone de texte valign.

0

Une solution très simple consiste à utiliser un Datagridview avec 1 en-tête de colonne, 1 ligne, colonne et ligne non visible et définir DefaultCellStyle.Alignment = MiddleLeft.

Et désactiver l'ajout/suppression de lignes et vous avez une zone de texte qui aligne parfaitement le texte.