Añadir etiqueta dentro del control de cuadro de texto

Quiero hacer un control que herede de TextBox y que tenga una etiqueta dentro de la cual se “pegue” al lado derecho del cuadro de texto y que el texto no sea editable por el usuario, sino que esté establecido por una propiedad. ¿Cómo se puede hacer esto? Me doy cuenta de que puede haber muchas razones por las cuales esta UX es una mala idea, pero tengo que hacerlo de esta manera.

Adaptación del botón de Hans Passant dentro de un cuadro de texto de winforms respuesta:

public class TextBoxWithLabel : TextBox { [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); Label label = new Label(); public TextBoxWithLabel() { label.BackColor = Color.LightGray; label.Cursor = Cursors.Default; label.TextAlign = ContentAlignment.MiddleRight; this.Controls.Add(label); } private int LabelWidth() { return TextRenderer.MeasureText(label.Text, label.Font).Width; } public string LabelText { get { return label.Text; } set { label.Text = value; SendMessage(this.Handle, 0xd3, (IntPtr)2, (IntPtr)(LabelWidth() << 16)); OnResize(EventArgs.Empty); } } protected override void OnResize(EventArgs e) { base.OnResize(e); int labelWidth = LabelWidth(); label.Left = this.ClientSize.Width - labelWidth; label.Top = (this.ClientSize.Height / 2) - (label.Height / 2); label.Width = labelWidth; label.Height = this.ClientSize.Height; } } 

Resultado:

introduzca la descripción de la imagen aquí

Le sugeriré que cree un UserControl con TextBox y una Label acoplada a la derecha. Eso debería ser menos doloroso y libre de errores.

Como dijo que ya usa TextBox para evitar la refactorización, puede agregar todas las propiedades que usó en TextBox como “Propiedades de proxy”. Algo como esto:

 class MyTextBox : UserControl { public int TextLength { get { return textbox.TextLength; } } ... } 

Esto puede ayudarte a evitar mucho refactoring.

Realmente crearía un control de composición, o simplemente un UserControl, y pondría una etiqueta y un cuadro de texto uno al lado del otro. Luego puede eliminar los bordes alrededor del cuadro de texto y rodearlos con un cuadro de borde para imitar el diseño de cuadro de texto normal.

Finalmente, me aseguraré de que el usuario controle las propiedades, como el Text se asigna al cuadro de texto, por lo que es fácil usar el control como reemplazo de caída.