2017-08-18 37 views
1

我正在创建一个具有条目的应用程序。我试图限制条目只允许数字输入。我已经尝试过使用Keyboard =“Numeric”。然而,对于iPad而言,键盘的字符数不仅仅是数字。所以我不得不限制输入的内容。然而,当我这样做时,如果用户键入括号,例如,它确实会停止输入字符。但是如果用户按下撤消,则会崩溃。我认为这是因为软件键盘与应用程序分离,所以它正在寻找该括号字符,但它不在那里。这里是我的代码:如何在xamarin中禁用/取消撤消按钮

private void Entry_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     Entry theEntry = (Entry)sender; 
     string entryText = theEntry.Text; 
     if(entryText != null && entryText.Length != 0) 
     { 
      char theMostRecentInput = entryText[entryText.Length - 1]; 
      if(!Extension.IsNumeric(theMostRecentInput)) 
      { 
       theEntry.TextChanged -= Entry_TextChanged; 
       theEntry.Text = e.OldTextValue; 
       theEntry.TextChanged += Entry_TextChanged; 
      } 
     } 
    } 

感谢您的帮助!

+0

不知道如何解决这个问题,但你有另一个错误。你假设最近输入的字符是字符串中的最后一个字符。更好的方法可能是在用户完成表单时验证数字,并通知用户该字符串是否包含无效字符。在用户输入的文本框中设置字符串将导致意外的结果。 – Slepz

回答

0

我会在Entry自定义渲染这样你就可以通过ShouldChangeCharacters控制输入,而不必通过允许输入,然后不得不删除的处理程序和更改文本回到旧值杂牌它做到这一点。 ..

下面是一个允许数字的快速示例,它也自动处理粘贴非数字字符串的剪贴板,因为这些字符串将被禁止。我正在使用NSCharacterSet.DecimalDigits字符集,因为这会被操作系统国际化,但是您可以允许/禁止任何您选择的字符。

你也可以包括触觉,视觉或听觉反馈上不允许使用/拒绝的条目...

[assembly: ExportRenderer(typeof(NumericEntry), typeof(NumericEntryRenderer))] 
namespace Forms_PCL_Tester.iOS 
{ 
    public class NumericEntryRenderer : EntryRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Entry> e) 
     { 
      base.OnElementChanged(e); 
      if (e.NewElement != e.OldElement) 
       if (Control != null) 
       { 
        Control.KeyboardType = UIKeyboardType.NumbersAndPunctuation; 
        Control.ShouldChangeCharacters += (UITextField textField, NSRange range, string replacementString) => 
        { 
         foreach (var aChar in replacementString) 
          if (!NSCharacterSet.DecimalDigits.Contains(aChar)) 
           return false; 
         return true; 
        }; 
       } 
     } 
    } 
}