Я хочу создать элемент управления, который наследуется от TextBox и который имеет метку, внутри которой "прилипает" к правой стороне текстового поля, и какой текст не редактируется пользователем, а задается свойством. Как это может быть сделано? Я понимаю, что может быть много причин, почему этот UX - плохая идея, но я должен сделать это таким образом.
Адаптация из кнопки 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;
}
}
Результат:
Я предлагаю вам создать UserControl
с TextBox
и Label
закрепленной справа. Это должно быть больно и без ошибок.
Как вы уже сказали, вы уже используете TextBox
чтобы избежать многого рефакторинга, вы можете добавить все свойства, которые вы использовали в TextBox, как "Свойства прокси". Что-то вроде этого:
class MyTextBox : UserControl
{
public int TextLength { get { return textbox.TextLength; } }
...
}
Это может помочь избежать многого рефакторинга.
Я бы на самом деле создал элемент управления composit или просто UserControl и помещал ярлык и текстовое поле рядом друг с другом. Затем вы можете удалить границы вокруг текстового поля и окружить их рамкой, чтобы имитировать нормальный дизайн текстового поля.
Наконец, я бы удостоверился, что пользователь контролирует свойства, такие как Text
, сопоставляется с Text
полем, поэтому его легко использовать в качестве замены замены.
(IntPtr)3
(на языке C #) ... я забыл изменить его на 2 для правого поля. LOL: D