如何在XAML中创建TextBox样式,以便TextBox只接受数字

时间:2014-12-02 23:47:36

标签: wpf xaml

我想为TextBox创建Style,以便它只接受数字而不接受任何字符或特殊符号。

目前我在后面的代码(在C#中)的帮助下这样做:

Regex regex = new Regex("[^0-9]+");
e.Handled = regex.IsMatch(e.Text);

是否可以制作XAML样式来处理这种情况?

1 个答案:

答案 0 :(得分:0)

仅使用XAML是不可能的。根据我的经验,最好的办法是从TextBox派生,向任何可以输入文本的东西添加处理程序,然后在文本进入时验证文本。要么通过处理事件来拒绝更改,要么通过让路由接受它事件传播。

一般基类如下:

public abstract class RestrictedTextBox : TextBox
{
    protected RestrictedTextBox()
    {
        PreviewTextInput += RestrictedTextBox_PreviewTextInput;
    }

    protected abstract bool IsValid(string proposed);

    private void RestrictedTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        string proposed = GetProposedText(e.Text);

        if (!IsValid(proposed))
            e.Handled = true;
    }

    private string GetProposedText(string newText)
    {
        var text = this.Text;
        if (SelectionStart != -1)
            text.Remove(this.SelectionStart, this.SelectionLength);

        return text.Insert(this.CaretIndex, newText);
    }
}

要为DoubleTextBox创建一个具体的实例,您可以轻松地执行:

public class DoubleTextBox : RestrictedTextBox
{
    protected override bool IsValid(string proposed)
    {
        double throwAwayDouble;
        return double.TryParse(proposed, out throwAwayDouble);
    }
}

这只允许您输入成功解析为double的文本。我将留给你处理keydown事件(对于空格键)和粘贴事件