0

我知道有人问了这个问题,但我的代码中还有另一个问题:

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

它可以工作,但是当我输入Shift+6&时,当按 shift 时输入代码将不起作用,但在按下 6 后它可以工作并输入为&.

我怎样才能禁用它?我在想一个全局变量,它保留前一个键,如果它是 shift 不键入但它也保持 shift,则不会同时用数字键按下 shift,或者在数字键之前预置 shift。

4

4 回答 4

1

你为什么不TryParse输入文本,看看它是否int而不是验证密钥。

如果您希望保留当前的实现,那么还要检查Modifier键以避免出现Shift+6.

于 2013-02-04T09:26:50.823 回答
1

您也可以检查特殊键,例如Shift: Keyboard.Modifiers == ModifierKeys.Shift

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

于 2013-02-04T09:27:34.963 回答
0

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

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

请注意,“\d”将匹配 [0-9] 和其他数字字符,如东方阿拉伯数字 ٠١٢٣٤٥٦٧٨٩。使用 "^[0-9]+$" 将匹配限制为仅阿拉伯数字 0 - 9。

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

于 2013-02-04T09:37:22.690 回答
0

你应该使用PreviewTextInput 。它在任何其他 textchanged 或任何其他关键事件之前引发,如果你设置

  • e.Handled为 True 表示所有即将发生的事件都已处理,包括 (Textchanged,...),因此它们将被取消。如果
  • e.Handeled false 所以一切正常

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

注意 预览事件文本框尚未更改,因此您从 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);
        };
于 2013-02-04T09:28:20.800 回答