【发布时间】:2014-11-26 03:35:38
【问题描述】:
我正在为 windows 8.1 和 windows phone 8.1 构建一个通用应用程序,经过一番繁重的谷歌搜索后,我仍然坚持用户输入验证。
我正在尝试做的是即时正确的用户输入。用户将输入电话号码,并且在键入时应更正数字(使用 libphonenumber 库)。
我在网上找到的解决方案似乎不适用于 8.1 通用项目(或者只是我的错?):
-
PreviewTextInput或PreviewKeyDown事件不可用 -
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