web-dev-qa-db-fra.com

C # Redimensionner la zone de texte pour l'adapter au contenu

J'écris un programme où l'utilisateur devrait pouvoir écrire du texte dans une zone de texte. Je voudrais que la zone de texte se redimensionne elle-même, afin qu'elle corresponde au contenu. J'ai essayé ce qui suit:

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
    System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont);
    this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0);
}

Je reçois une erreur indiquant que Graphics ne fonctionne pas pour TextChangedEventArgs. Existe-t-il une autre façon de redimensionner la zone de texte?

24
user744289

Vous devriez essayer un code comme ci-dessous. Cela a bien fonctionné pour moi.

private void textBox1_TextChanged(object sender, EventArgs e)
{
  Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
  textBox1.Width = size.Width;
  textBox1.Height = size.Height;
}

Pour plus d'informations, reportez-vous à TextRenderer.MeasureText ()

J'ajoute cette réponse car je ne vois pas le fixed width aspect d'une zone de texte en cours de discussion dans l'un des autres. Si vous avez une largeur fixe pour votre zone de texte et que vous souhaitez ajuster uniquement sa hauteur, vous pouvez faire quelque chose comme ceci:

Quelque chose comme ça donne la hauteur du texte comme la façon dont il est dessiné dans la zone de texte enveloppée de mots multiligne elle-même:

SizeF MessageSize = MyTextBoxControl.CreateGraphics()
                                .MeasureString(MyTextBoxControl.Text,
                                                MyTextBoxControl.Font,
                                                MyTextBoxControl.Width, 
                                                new StringFormat(0));

Je ne suis pas sûr de ce que StringFormat devrait être, mais les valeurs StringFormatFlags ne semblent pas s'appliquer à un maquillage par défaut TextBox.

Maintenant avec MessageSize.Height vous connaissez la hauteur du texte dans la zone de texte.

6
Mike de Klerk

Votre liaison au mauvais événement et vous ne pouvez pas utiliser l'objet graphique dans l'objet TextChangedEventArgs.

Essayez d'utiliser l'événement TextChanged. L'extrait suivant fonctionne:

public Form1()
{
    InitializeComponent();

    this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
}

void textBox1_TextChanged(object sender, EventArgs e)
{
    System.Drawing.SizeF mySize = new System.Drawing.SizeF();

    // Use the textbox font
    System.Drawing.Font myFont = textBox1.Font;

    using (Graphics g = this.CreateGraphics())
    {
        // Get the size given the string and the font
        mySize = g.MeasureString(textBox1.Text, myFont);
    }

    // Resize the textbox 
    this.textBox1.Width = (int)Math.Round(mySize.Width, 0);
}

}

4
Daniel Peñalba

J'ai eu le même problème et je l'ai résolu de manière plus simple.

J'ai utilisé la propriété AutoSize d'un contrôle Label. J'ai ajouté une étiquette invisible à mon formulaire, définissez sa propriété AutoSize True. Lorsque j'ai besoin de changer la taille de mon TextBox, j'utilise ce code:

MyLabel.Text = MyTextBox.Text;
MyTextBox.Size = MyLabel.Size;

J'ai défini la taille maximale et minimale de l'étiquette pour de meilleurs résultats. S'amuser

3
Nour Assi

Vous devrez utiliser la méthode CreateGraphics () du formulaire pour créer l'instance Graphics sur laquelle mesurer la chaîne.

La classe TextChangedEventArgs n'a pas de propriété Graphics, c'est-à-dire une propriété de la classe PaintEventArgs transmise au gestionnaire d'événement Paint

1
samjudson

Essaye ça:

using System.Drawing;
...

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    // Determine the correct size for the text box based on its text length   

    // get the current text box safely
    TextBox tb = sender as TextBox;
    if (tb == null) return;

    SizeF stringSize;

    // create a graphics object for this form
    using(Graphics gfx = this.CreateGraphics())
    {
        // Get the size given the string and the font
        stringSize = gfx.MeasureString(tb.Text, tb.Font);
    }

    // Resize the textbox 
    tb.Width = (int)Math.Round(stringSize.Width, 0);

}

Essentiellement, vous créez votre propre objet Graphics pour le formulaire, puis le mesurez en fonction du texte et de la police de la TextBox. using éliminera correctement l'objet Graphics - votre code précédent aurait horriblement fui!

1
Polynomial

Graphics.Measure chaîne que vous pouvez faire o PaintEventArgs , pas sur TextChangedEventArgs

Ce que je pense que tu veux c'est

System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
Graphics graphics = this.CreateGraphics();
SizeF textSize = graphics.MeasureString("This is a test", myFont);

Le problème est que vous ne pouvez tout simplement pas créer un objet Graphics en l'allouant simplement car il n'a pas de constructeur public, il vaut donc mieux utiliser TextRenderer.MeasureText , comme dans http://msdn.Microsoft.com/en-us/library/y4xdbe66.aspx

TextRenderer est moins précis car il utilise GDI et Graphics utilise GDI +, donc vous devriez peut-être laisser une petite marge sur la valeur que vous obtenez de la propriété Width.

J'espère que cela t'aides

0
aelena

Quel que soit le but.

Si la taille de la zone de texte doit être configurée dynamiquement en fonction de la chaîne, qui doit être le texte à l'intérieur de cette zone, il n'y a pas d'option Nice.

Raisons: MeasureString utilise des formateurs de chaîne habituels comme délimiteurs pour sa propre largeur et hauteur. Les moyens, retour chariot et saut de ligne sont également analysés. Il en résulte un sizeF.Width et sizeF.Height.

Selon la chaîne (et sa police et le nombre de lignes), ces deux variables peuvent porter des valeurs, qui sont parfois inutiles pour être utilisées comme valeurs de largeur/hauteur d'une zone de texte (car elles peuvent être plus grandes que les valeurs du formulaire parent et cela redimensionnerait la zone de texte à une taille, avec des bordures gauche et inférieure au-delà de celles du formulaire parent).

Certaines solutions sont toujours disponibles, selon l'objectif que l'on souhaite atteindre.

Une idée serait: créer une zone de texte dans le concepteur, taille = 100 X 100. activer le retour à la ligne.

Dans le gestionnaire d'événements OnTextChanged de la zone de texte, nous redimensionnons simplement la largeur de la zone de texte à une valeur définie par nous-mêmes (par exemple, parentform.Width ou une autre valeur matérielle).

Cela entraînerait le retour à la ligne Word pour recalculer la chaîne dans la zone de texte et cela réorganiserait tous les caractères à l'intérieur de la zone de texte, car le retour à la ligne Word est activé.

Par exemple, la hauteur de la zone de texte peut être définie durement sur parentform.Height.

MAIS, mieux: définissez la hauteur dynamiquement, en fonction de la valeur Y de ReturnValue (Point) de la méthode texbox.GetPositionFromCharIndex (textbox.TextLength -1). Ensuite, avec Math.Min () déterminez ce qui est plus petit (parentform.Height ou Point.Y), et réinitialisez la taille de la zone de texte à la nouvelle taille (previousDetermWidth, nowDetermedHeight).

Veuillez garder à l'esprit (si les barres de défilement sont activées) pour ajouter environ 17 pixels à votre calcul de largeur.

Meilleures salutations

0
icbytes

Avez-vous essayé de définir yourTextBox.AutoSize = true;? Cette propriété peut être masquée dans le concepteur graphique, mais vous pouvez la définir dans le constructeur de formulaire juste après l'appel de InitializeComponent();.

0

tout d'abord, créez une méthode pour adapter la TextBox à son contenu.

private void AutoSizeTextBox(TextBox txt)
{
    const int x_margin = 0;
    const int y_margin = 2;
    Size size = TextRenderer.MeasureText(txt.Text, txt.Font);
    txt.ClientSize =
        new Size(size.Width + x_margin, size.Height + y_margin);
}

puis avec la fonction de gestion d'événements TextChanged AutoSizeTextBox () pour rendre la fonction TextBox ajuste son texte lorsque le texte change.

private void txtContents_TextChanged(object sender, EventArgs e)
{
    AutoSizeTextBox(sender as TextBox);
}

C’est tout, pour plus d’informations:

redimensionner une zone de texte pour l'adapter à son texte

0
ajd.nas