Добавить метку внутри элемента управления textbox

1

Я хочу создать элемент управления, который наследуется от TextBox и который имеет метку, внутри которой "прилипает" к правой стороне текстового поля, и какой текст не редактируется пользователем, а задается свойством. Как это может быть сделано? Я понимаю, что может быть много причин, почему этот UX - плохая идея, но я должен сделать это таким образом.

Теги:
winforms
label
textbox

3 ответа

3
Лучший ответ

Адаптация из кнопки Hans Passant в ответном текстовом поле winforms:

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;
  }
}

Результат:

Изображение 174551

  • 0
    Это прекрасно работает! Именно то, что я хотел. Благодарю.
  • 0
    ROFL. я знаю где я все испортила пытался установить (IntPtr)3 (на языке C #) ... я забыл изменить его на 2 для правого поля. LOL: D
1

Я предлагаю вам создать UserControl с TextBox и Label закрепленной справа. Это должно быть больно и без ошибок.

Как вы уже сказали, вы уже используете TextBox чтобы избежать многого рефакторинга, вы можете добавить все свойства, которые вы использовали в TextBox, как "Свойства прокси". Что-то вроде этого:

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

Это может помочь избежать многого рефакторинга.

  • 0
    Да, но тогда я должен скопировать все свойства текстового поля в usercontrol ... или изменить существующий код ...
  • 0
    @ ian93 Сколько свойств? Это разовая работа. Вы можете добавить свойства прокси, как я показал в моем ответе. Это не так сложно.
Показать ещё 5 комментариев
0

Я бы на самом деле создал элемент управления composit или просто UserControl и помещал ярлык и текстовое поле рядом друг с другом. Затем вы можете удалить границы вокруг текстового поля и окружить их рамкой, чтобы имитировать нормальный дизайн текстового поля.

Наконец, я бы удостоверился, что пользователь контролирует свойства, такие как Text, сопоставляется с Text полем, поэтому его легко использовать в качестве замены замены.

  • 0
    кажется, много сложностей ни за что. Вы можете просто создать метку члена в унаследованном классе текстового поля и установить его положение в конструкторе относительно текстового поля. просто и эффективно.
  • 0
    @porkchop Я думаю, у вас есть правильная идея ... вы можете расширить это в ответ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню