Textbox PreviewTextInput - 仅接受数字和':'

时间:2014-02-16 16:48:24

标签: c# wpf textbox

我有这段代码:

foreach (char ch in e.Text)
        {
            if (!Char.IsDigit(ch))
                e.Handled = true;
            else
            {
                if(!(ch.Equals(':')))
                    e.Handled = true;
            }
        }

只有

if (!Char.IsDigit(ch))
                e.Handled = true;

我可以写数字,当我只使用第二个if()时,我只能写':'。 但是当我使用它们时,我什么也写不出来。

2 个答案:

答案 0 :(得分:2)

只需使用布尔逻辑:

foreach(var ch in e.Text) {
  if (!((Char.IsDigit(ch) || ch.Equals(':'))) {
    e.Handled = true;

    break; 
  }
}

答案 1 :(得分:2)

另一种方法是使用linq语句。这取决于个人偏好,但许多人发现linq更具可读性。

e.Handled = !e.Text.Any(x => Char.IsDigit(x) || ':'.Equals(x));

这是一个相当容易的单线程,随着c#6的出现,整个方法可以写成lambda函数,如下所示:

private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) =>
    e.Handled = !e.Text.Any(x => Char.IsDigit(x) || ':'.Equals(x));

请记住,PreviewTextInput不处理空格字符,这些方法不会过滤掉它们。 MSDN forums

提供了解释
  

因为一些IME会将空白击键视为文本合成过程的一部分,这就是Avalon通过TextInput事件报告正确的合成文本的原因。