目录

一、引言

二、文本框输入限制

1. 常见的文本框输入限制

2. 使用正则表达式进行输入验证

3. 使用InputMask控件

4. 使用Preview事件进行输入过滤

4.1、只能输入数字

4.2、只能输入英文字母和数字 

4.3、只能输入中文汉字


一、引言

WPF文本框是用户输入数据的重要工具,但有时候我们需要确保用户输入的数据满足特定的格式或约束条件。这就是为什么限制文本框的输入变得如此重要。

二、文本框输入限制

1. 常见的文本框输入限制

常见的输入限制包括:

  • 限制输入为数字。
  • 限制输入的最大长度。
  • 限制输入为特定的格式,如日期、电话号码等。

2. 使用正则表达式进行输入验证

在WPF中,我们可以使用正则表达式(Regex)来验证输入。以下是一个简单的示例,说明如何验证一个输入字段是否符合特定的正则表达式。

首先,我们创建一个名为 RegexValidator 的自定义验证器类,该类实现了 IValidator 接口:

public class NegativeNumberInputMask : InputMask  
{  
    public NegativeNumberInputMask()  
    {  
        AcceptingCharacterEventArgs allowedCharactersEventArgs = new AcceptingCharacterEventArgs(Keys.Back, string.Empty);  
        this.SpecialKeyPressed += InputMask_SpecialKeyPressed;  
    }  
  
    private void InputMask_SpecialKeyPressed(object sender, SpecialKeyPressedEventArgs e)  
    {  
        switch (e.Key)  
        {  
            case Keys.Back:  
                this.RemoveChar();  
                break;  
            case Keys.Enter:  
                this.RemoveChar();  
                break;  
            default:  
                if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;  
                break;  
        }  
    }  
}

 

接下来,在XAML中,我们创建一个带有验证规则的TextBox:

<TextBox x:Name="textBox" Text="{Binding Path=SomeProperty, UpdateSourceTrigger=PropertyChanged}">

    <Binding.ValidationRules>

    <local:RegexValidator Pattern="^\d{3}-\d{3}-\d{4}$" />

    </Binding.ValidationRules>

</TextBox>

在这个例子中,我们使用了一个简单的正则表达式 "^\d{3}-\d{3}-\d{4}$" 来验证一个格式为 "XXX-XXX-XXXX" 的社会保险号码。如果输入的文本符合这个模式,那么验证器将返回 ValidationError.None,否则它将返回一个带有错误消息的 ValidationError 对象。

3. 使用InputMask控件

WPF中的InputMask控件允许你定义特定的输入格式,它将控制用户输入的方式。例如,你可以使用InputMask控件定义一个电话号码的输入格式,使用户只能输入数字和特定的分隔符。

在WPF中,InputMask控件是一个用于在输入过程中控制和格式化文本的控件。它通常用于确保用户输入的文本符合特定的格式要求。

以下是如何在WPF中使用InputMask控件来实现对文本框内容校验的代码示例:

首先,确保已经在项目中引入了 System.Windows.Controls.Input.InputMask 命名空间。

<Window ...>  
    <Window.Resources>  
        <local:NegativeNumberInputMask x:Key="NegativeNumberInputMask"/>  
    </Window.Resources>  
      
    <TextBox x:Name="textBox" Text="{Binding Path=SomeProperty, UpdateSourceTrigger=PropertyChanged}" Input掩码="{StaticResource NegativeNumberInputMask}"/>  
</Window>

在上述代码中,我们首先在资源中定义了一个名为 "NegativeNumberInputMask" 的InputMask。然后,我们将这个InputMask作为TextBox的Input掩码。

接下来,定义NegativeNumberInputMask类:

public class NegativeNumberInputMask : InputMask  
{  
    public NegativeNumberInputMask()  
    {  
        AcceptingCharacterEventArgs allowedCharactersEventArgs = new AcceptingCharacterEventArgs(Keys.Back, string.Empty);  
        this.SpecialKeyPressed += InputMask_SpecialKeyPressed;  
    }  
  
    private void InputMask_SpecialKeyPressed(object sender, SpecialKeyPressedEventArgs e)  
    {  
        switch (e.Key)  
        {  
            case Keys.Back:  
                this.RemoveChar();  
                break;  
            case Keys.Enter:  
                this.RemoveChar();  
                break;  
            default:  
                if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;  
                break;  
        }  
    }  
}

在上述代码中,通过重写 InputMask 的 SpecialKeyPressed 事件处理程序来限制输入。例如,我们不允许输入非数字字符,并且不允许删除已经输入的字符(通过始终删除最后一个字符)。对于其他特殊键,例如回车键,我们也进行了处理。

4. 使用Preview事件进行输入过滤

WPF文本框的Preview事件(如PreviewTextInput、PreviewKeyDown)可以用来截取用户输入之前的操作,从而在用户输入之前进行过滤、修改或验证。

首先要在Textbox事件中找到previewinput事件

然后在一个类中把文本框限制的代码都放在里面。

4.1、只能输入数字

        /// <summary>
        /// 只能输入数字
        /// </summary>
        /// <param name="keyPressE">KeyPressEventArgs内容</param>
        public static void Number(object sender, TextCompositionEventArgs e)
        {
            Regex re = new Regex("[^0-9]+");
            if (e.Handled = re.IsMatch(e.Text))
            {
                e.Handled = true;
            }
            else
            {
                e.Handled = false;
            }
        }

4.2、只能输入英文字母和数字 

        /// <summary>
        /// 只能输入英文字母和数字
        /// </summary>
        /// <param name="keyPressE">KeyPressEventArgs内容</param>
        public static void InputNumEng(object sender, TextCompositionEventArgs e)
        {

            Regex re = new Regex("^[A-Za-z0-9]+$");
            if (e.Handled = re.IsMatch(e.Text))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

4.3、只能输入中文汉字

        /// <summary>
        /// 只能输入中文汉字
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public static void InputChinese(object sender, TextCompositionEventArgs e)
        {
            Regex re = new Regex("^[\u4e00 - \u9fa5]{ 0, }$");
            if (e.Handled = re.IsMatch(e.Text))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

需要注意的是,在WPF框架中空格键是触发不了previewinput事件的,所以上面的只能输入数字的限制中还是可以输入空格的,这个也好解决,我们只需要在textbox的keydown事件中单独把空格键禁用掉就可以了。

        private void txtUserName_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Space)
            {
                e.Handled = true;//不可输入
            }
        }

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐