C# WPF实现TextBox屏蔽非法字符

本篇文章总结一下,如何在WPF中,通过PreviewKeyDown事件,实现在TextBox中只允许输入数字,屏蔽非法字符。

以前用Winform时,我习惯用KeyPress事件管控TextBox中的字符输入,但是在WPF中,发现没有KeyPress事件了...经过一番研究,发现可以用PreviewKeyDown事件代替。这里说明一下,除了PreviewKeyDown事件,另外还有个KeyDown事件,也可以实现类似的功能,不过和PreviewKeyDown相比,KeyDown事件并不完美,因为有些按键不会触发KeyDown事件,比如Backspace(退格)键,比如Space(空格)键。其中Space键无法触发KeyDown事件是比较致命的,因为这样就无法避免在TextBox中输入空格字符了。

以下是具体的C#代码实现。

一. 首先定义一个Enum,该Enum目前包含两个枚举值,从名称可以看出,通过这两个枚举值,可以达到在TextBox中只允许输入数字(针对整数),或允许输入数字和点号(针对浮点数)的目的。也可以根据项目实际需要,增加更多枚举值(比如增加允许输入"-"号的选项,以支持负数),实现更多样化的管控。

public enum FilterEnum
{
     AllowNumericCharactersOnly,
     AllowNumericAndDotCharacters
}

二. 定义屏蔽函数,用于屏蔽TextBox中的非法字符,实现在文本框中只允许输入数字或点号。

注意:在管控数字键D0~D9时,需要在if判定中,增加&& e.KeyboardDevice.Modifiers != ModifierKeys.Shift语句,以防按住Shift键+数字键进行输入的情况,避免将和数字对应的符号字符(如!@等)输入到TextBox中。

/// <summary>
/// 屏蔽TextBox中的非法字符(用于文本框只允许输入数字或点号的场景)
/// </summary>
public void ShieldIllegalCharacters(object sender, KeyEventArgs e, FilterEnum filter)
{
    TextBox txtBox = sender as TextBox;
           
    if (e.Key == Key.Back || //针对Backspace(退格)键
        e.Key == Key.Enter || //针对Enter(回车)键
        e.Key == Key.Tab //针对Tab键
        e.Key == Key.Left || //针对左方向键(即允许在文本框中移动光标)
        e.Key == Key.Right) //针对右方向键(即允许在文本框中移动光标)
    {
        e.Handled = false; //允许输入
    }
    else if ((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || //针对小键盘上的数字键(0-9)
             (e.Key == Key.Decimal && filter == FilterEnum.AllowNumericAndDotCharacters)) //针对小键盘上的点号键
    {
         //如果文本框中已经有"."字符,此时再输入"."字符的话,会被屏蔽掉
         if (txtBox.Text.Contains(".") && e.Key == Key.Decimal) //Key.Decimal是:小键盘上的点号键
         {
             e.Handled = true; //屏蔽输入
             return;
         }
         e.Handled = false; //允许输入
    }
    else if (((e.Key >= Key.D0 && e.Key <= Key.D9) || //针对数字键(0-9)
              (e.Key == Key.OemPeriod && filter == FilterEnum.AllowNumericAndDotCharacters)) && //针对点号键
               e.KeyboardDevice.Modifiers != ModifierKeys.Shift) //针对按住Shfit键+数字键的情况(如Shift+1会输入"!")
    {
         //如果文本框中已经有"."字符,此时再输入"."字符的话,会被屏蔽掉
         if (txtBox.Text.Contains(".") && e.Key == Key.OemPeriod) //Key.OemPeriod是:非小键盘上的点号键
         {
             e.Handled = true; //屏蔽输入
             return;
         }
         e.Handled = false; //允许输入
    }
    else
    {
         e.Handled = true; //屏蔽输入
    }
}

三. 哪个TextBox要管控字符输入,即可在其PreviewKeyDown事件处理函数中,调用以上ShieldIllegalCharacters函数。

private void TextBox_Example_PreviewKeyDown(object sender, KeyEventArgs e)
{
    ShieldIllegalCharacters(sender, e, FilterEnum.AllowNumericAndDotCharacters); //允许输入数字和点号,即文本框中允许输入浮点数
    //ShieldIllegalCharacters(sender, e, FilterEnum.AllowNumericCharactersOnly); //只允许输入数字,即文本框中允许输入整数
}

最后,提醒一下,TextBox的InputMethod.IsInputMethodEnabled属性需要设置为False,否则无法屏蔽中文字符的输入。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值