WPF文本框 - 仅附加

时间:2014-05-11 16:11:24

标签: c# wpf

我需要一个文本框,最多可以包含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

的情况下不接受任何退格

1 个答案:

答案 0 :(得分:1)

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

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

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控件中设置布尔值并使布尔值私有,你不想用那种东西给调用者带来麻烦。代码按预期工作,并完成您似乎想要的。