【问题标题】:Validating TextBox input as you type in 8.1 universal app在 8.1 通用应用程序中键入时验证文本框输入
【发布时间】:2014-11-26 03:35:38
【问题描述】:

我正在为 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);
}

更新:好吧,这很丑(临时、非声明性、不灵活),但它确实有效。真的是这样吗? 凭借 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;
}

【问题讨论】:

  • 只是一个想法——文本框的 KeyDown 事件在 TextChanged 之前被触发,也许尝试把你的逻辑放在那里?
  • @MichałŻ 感谢您的评论,我更新了帖子。

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


【解决方案1】:

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

只有当应用程序正在验证键(而不是字符)并且——更重要的是——如果输入来自键盘时,键事件才会起作用。关键事件不会捕获粘贴的数据、墨迹或语音识别、IME 等。

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

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

您说得对,没有内置任何高级验证系统。我相信有几个第三方版本,根据自己的规范构建验证控件并不难。

您可以在http://wpdev.uservoice.com 的 Windows 平台开发反馈站点上请求新功能并对其进行投票

【讨论】:

  • 好的,知道了,感谢您的详细解答。我们不得不求助于这种低级的东西真是太可惜了,而拥有声明式 UI 系统的整个想法就是为了减轻您的负担。
【解决方案2】:

KeyDown 是您需要的。你已经明白了。

但是如果你按下一个键并保持按下它会起作用吗?

另外,试试 KeyPress()。

【讨论】:

  • 我想要一些干净的东西。声明方式。阻止密钥简直是愚蠢且不灵活。不敢相信这是要走的路,但似乎也找不到有效的方法。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多