簡體   English   中英

在文本框控件內添加標簽

[英]Add label inside textbox control

我想制作一個控件,該控件繼承自TextBox,並且具有一個標簽,其中的標簽“粘貼”到文本框的右側,並且該文本不是用戶可編輯的,而是由屬性設置的。 如何才能做到這一點? 我意識到,這種UX不好的想法可能有很多原因,但是我必須這樣做。

根據winforms文本框內的Hans Passant的Button改編:

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

結果:

在此處輸入圖片說明

我建議您創建一個TextBox和一個正確停靠的LabelUserControl 那應該更省力,並且沒有錯誤。

正如您所說的,您已經在使用TextBox來避免大量重構,您可以將在TextBox中使用的所有屬性添加為“代理屬性”。 像這樣:

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

這可以幫助您避免過多的重構。

我實際上會創建一個復合控件,或者只是一個UserControl,然后將標簽和文本框彼此相鄰放置。 然后,您可以刪除文本框周圍的邊框,並用邊框包圍它們,以模仿普通的文本框設計。

最后,我將確保用戶控件的屬性(如“ Text已映射到“文本框”,因此可以輕松地將控件用作放置替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM