我試圖創建一個繼承NumericUpDown
以顯示可設置單位的自定義控件。自定義控件|字段填充
這是(視覺)我有這麼遠:
我的代碼:看起來有點長,但是,這不是做那麼多
class NumericUpDownUnit : NumericUpDown
{
public event EventHandler ValueChanged;
/// <summary>
/// Constructor creates a label
/// </summary>
public NumericUpDownUnit()
{
this.TextChanged += new EventHandler(TextChanged_Base);
this.Maximum = 100000000000000000;
this.DecimalPlaces = 5;
this.Controls.Add(lblUnit);
lblUnit.BringToFront();
UpdateUnit();
}
public void TextChanged_Base(object sender, EventArgs e)
{
if(ValueChanged != null)
{
this.ValueChanged(sender, e);
}
}
/// <summary>
/// My designer property
/// </summary>
private Label lblUnit = new Label();
[Description("The text to show as the unit.")]
public string Unit
{
get
{
return this.lblUnit.Text;
}
set
{
this.lblUnit.Text = value;
UpdateUnit();
}
}
/// <summary>
/// When unit has changed, calculate new label-size
/// </summary>
public void UpdateUnit()
{
System.Drawing.Size size = TextRenderer.MeasureText(lblUnit.Text, lblUnit.Font);
lblUnit.Padding = new Padding(0, 0, 0, 3);
lblUnit.Size = new System.Drawing.Size(size.Width, this.Height);
lblUnit.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
lblUnit.BackColor = System.Drawing.Color.Transparent;
lblUnit.Location = new System.Drawing.Point(this.Width-lblUnit.Width-17, 0);
}
/// <summary>
/// If text ends with seperator, skip updating text as it would parse without decimal palces
/// </summary>
protected override void UpdateEditText()
{
if (!this.Text.EndsWith(".") && !this.Text.EndsWith(","))
Text = Value.ToString("0." + new string('#', DecimalPlaces));
}
/// <summary>
/// Culture fix
/// </summary>
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar.Equals('.') || e.KeyChar.Equals(','))
{
e.KeyChar = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToCharArray()[0];
}
base.OnKeyPress(e);
}
/// <summary>
/// When size changes, call UpdateUnit() to recalculate the lable-size
/// </summary>
protected override void OnResize(EventArgs e)
{
UpdateUnit();
base.OnResize(e);
}
/// <summary>
/// Usability | On enter select everything
/// </summary>
protected override void OnEnter(EventArgs e)
{
this.Select(0, this.Text.Length);
base.OnMouseEnter(e);
}
/// <summary>
/// If, when leaving, text ends with a seperator, cut it out
/// </summary>
protected override void OnLeave(EventArgs e)
{
if(this.Text.EndsWith(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator))
{
this.Text = this.Text.Substring(0, this.Text.Length - 1);
}
base.OnLeave(e);
}
}
我的問題:
該標籤目前覆蓋框的結尾。所以,如果一個大的價值來自於(或大小爲低)它得到由標籤覆蓋,出現在這裏:
我知道NumericUpDown
有類似滾動功能時,在輸入值比輸入框的大小更長。這是在框的結尾觸發的。
是否以任何方式設置類似填充爲框內文本的可能性?例如,將右側的填充設置爲我的標籤的大小?
我很喜歡這個自定義控件,但是這最後一件事很煩人。
不幸的是我不知道如何查找現有控件的屬性,例如有一個名爲UpdateEditText()
方法。也許有人可以告訴我如何查找這個基本功能/屬性。
非常感謝!
您可以免費獲得「滾動」功能,但它僅適用於控件呈現的文本。你只是在特定的點上疊加一個'Label'。我認爲你真的想嘗試將完整的文本提供給控件,而不是自己繪製任何文本。這可能意味着你已經管理文本和值,因爲文本將是非數字的。 – DonBoitnott
@DonBoitnott這是我第一個想法。但後來我意識到我已經用我的小數點修正來抓取文本。因此,將這些主題分開並不會那麼糟糕(例如使用標籤)。接受的答案在這裏很有效。 – C4u