本篇文章总结一下,如何在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,否则无法屏蔽中文字符的输入。