WPF文本框-仅追加

本文关键字:追加 文本 WPF | 更新日期: 2023-09-27 18:02:42

我需要一个文本框,可以包含最多8个字符,可以通过设置

来实现
this.textBox1.MaxLength = 8;

然而,有时我的程序会预先输入几个字符(即6)。当呈现给用户时,我希望他能够添加缺失的2,但不能删除预先输入的6个字符。

我不想有像

这样的东西
if(!textBox1.Text.Equals(strPreEntered)) throw new Exception(); // Or show a messagebox, or ..

理想情况下,我希望文本框在textBox1.Length == strPreEntered.Length

WPF文本框-仅追加

的情况下不接受任何退格

你真正想要的是一个标志,指示TextBox是否有预先输入的字符发送给它。当您将预先输入的字符发送到文本框时,将其设置为true。

然后在TextBox的OnKeyPress事件中,如果KeyCode是退格,如果设置了标志,则忽略按键。

public class FormTest : Form
{
    public FormTest() : base()
    {
        LimitedTextBox tb = new LimitedTextBox();
        this.Controls.Add(tb);
        tb.Text = "123456";
        tb.MaxLength = 8;
        tb.HasPreenteredText = true;
    }
}
public class LimitedTextBox : TextBox
{
    private int preenteredTextLength = -1;
    private bool hasPreenteredText = false;
    public bool HasPreenteredText
    {
        get { return hasPreenteredText; }
        set
        {
            if (value == true)
            { preenteredTextLength = this.TextLength; }
            else
            { preenteredTextLength = -1; }
            hasPreenteredText = value;
        }
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (this.TextLength <= preenteredTextLength && e.KeyChar == ''b')
        { e.Handled = true; } // Causes the KeyPress to be skipped as it was already 'handled'
        if (this.SelectionStart < preenteredTextLength) // Prevent user from overwriting/deleting selected text beyond the minimum text length
        { e.Handled = true; }
        base.OnKeyPress(e);
    }
}

上面的代码有点潦草,但你当然想把它清理干净。也许有一个SetPreenteredText()方法处理在LimitedTextBox控件中设置布尔值并使布尔值私有,你不想用那种事情麻烦调用者。代码按照预期工作,并完成了您似乎想要的功能。