仅限文本框的数字

时间:2013-02-04 09:17:27

标签: c# xaml c#-4.0 windows-8

我知道这个问题已被问到,但我的代码中还有另一个问题:

(e.Key >= Windows.System.VirtualKey.Number0) && 
(e.Key <= Windows.System.VirtualKey.Number9)

它可以正常工作,但是当我输入Shift+6时,它会输入&代码在按住按键时不起作用,但在按下6之后它会起作用并输入&

如何禁用此功能?我正在考虑一个保持前一个键的全局变量,如果它的移位没有键入,但它也保持移位,同时没有用数字键按下shift或者在数字键之前预先移位。

4 个答案:

答案 0 :(得分:1)

为什么不TryParse编入文本并查看是否int而不是验证密钥。

如果您希望保留当前的实施,那么还要检查Modifier密钥,以避免Shift+6等情况。

答案 1 :(得分:1)

您也可以检查ShiftKeyboard.Modifiers == ModifierKeys.Shift等特殊键。

http://msdn.microsoft.com/en-us/library/system.windows.input.modifierkeys.aspx

答案 2 :(得分:0)

如果你设置

,你应该在任何其他textchanged或任何其他键事件之前使用 PreviewTextInput .it引发
  • e.Handled 为True表示所有即将发生的事件都已被处理过,包括(Textchanged,...),因此它们将被取消。 如果
  • e.Handeled false所以一切都继续Normaly

接下来你尝试将e.text(这是新的文本框值)解析为int,如果它的true(文本是int)e.handeled = False所以textchanged,.. continue,否则e.Handeled =真的发生了什么

注意 在预览事件上,文本框尚未更改,因此您从e.Text

中检索其值
    TextBox mytextblock= new TextBox();
    mytextblock.PreviewTextInput += mytextblock_PreviewTextInput;

    void mytextblock_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int val;
            e.Handled = !int.TryParse(e.Text, out val);
        };

答案 3 :(得分:0)

最好使用Regex检查用户是否输入了一个数字,因为用户也可以粘贴一个也有效的值。

如果您需要匹配多个数字,请使用“^ \ d + $”。

请注意,“\ d”将匹配[0-9]和其他数字字符,如东方阿拉伯数字0123456789。使用“^ [0-9] + $”将匹配仅限制为阿拉伯数字0 - 9.

您应该检查私人成员保留文本框中的有效值,并且每次更改文本框值时,您必须检查值是否有效,如果有效,则私有成员= textbox.value,否则textbox.value =私有成员,在这种情况下,您的用户将无法输入无效值