在8.1通用应用程序中键入时验证TextBox输入

时间:2014-11-20 16:17:42

标签: data-binding winrt-xaml windows-phone-8.1 windows-8.1 win-universal-app

我正在为Windows 8.1和Windows Phone 8.1构建一个通用应用程序,经过一些沉重的谷歌搜索后,我仍然坚持使用用户输入验证。

我尝试做的是即时更正用户输入。用户输入电话号码,数字应该在他输入时更正(使用libphonenumber库)。

我在网上找到的解决方案似乎不适用于 8.1通用项目(或者只是我的不好?):

  • PreviewTextInputPreviewKeyDown个活动不可用
  • System.ComponentModel.DataAnnotations.ValidationAttribute不可用
  • System.Windows.Data.Binding.ValidationRules不可用

以下是我目前的工作。对我来说似乎不对,有时你可以在纠正之前简单地看一下输入。什么是正确的方法?

void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
  TextBox box = sender as TextBox;
  int caret = box.SelectionStart;
  // sometimes input is briefly visible before it gets corrected
  box.Text = SomeLogic(box.Text);
  box.Select(caret, 0);
}

更新:好吧,这很丑陋(ad-hoc,非声明,不灵活),但它确实有效。这真的是这样吗? 凭借XAML的所有力量和力量...... Srsly?

void TextBox_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
  if(!IsNumber(e.Key)) {
    e.Handled = true;
  }
}

List<VirtualKey> NumericKeys = new List<VirtualKey>{
    VirtualKey.Number0,VirtualKey.Number1,VirtualKey.Number2,VirtualKey.Number3,VirtualKey.Number4,
    VirtualKey.Number5,VirtualKey.Number6,VirtualKey.Number7,VirtualKey.Number8,VirtualKey.Number9,
    VirtualKey.NumberPad0,VirtualKey.NumberPad1,VirtualKey.NumberPad2,VirtualKey.NumberPad3,VirtualKey.NumberPad4,
    VirtualKey.NumberPad5,VirtualKey.NumberPad6,VirtualKey.NumberPad7,VirtualKey.NumberPad8,VirtualKey.NumberPad9
  };

public static bool IsNumber(VirtualKey key)
{
  return NumericKeys.IndexOf(key) >= 0;
}

2 个答案:

答案 0 :(得分:0)

KeyDown是您需要的。而且你已经得到了它。

但如果按一个键并按住它会有效吗?

另外,试试KeyPress()。

答案 1 :(得分:0)

在TextBox中处理实时验证的唯一方法是处理TextChanged。

键事件仅在应用程序验证键(而不是字符)时才有效,更重要的是 - 如果输入来自键盘。关键事件不会捕获粘贴的数据,墨水或语音识别,IME等。

根据输入的性质,您可能希望自动更正,或者您可能希望在字段旁边显示无效条目消息,并且您可能希望阻止提交值,直到它有效。

注意不要自动更正正在进入有效条目的无效条目。当您拥有一个独立的字段而不是几个相互依赖的字段时,这一点就不那么重要了。如果两个字段相互依赖并要求以正确的顺序更改它们,那将非常令人沮丧。

您是正确的,没有任何高级验证系统。我相信有几个第三方版本,并且根据您自己的规范自行构建验证控件并不难。

您可以在http://wpdev.uservoice.com

的Windows平台开发反馈网站上请求并投票选择新功能