如何在xamarin中禁用/取消撤消按钮

时间:2017-08-18 22:13:21

标签: c# visual-studio xamarin xamarin.ios keyboard

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

{{1}}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

当对输入字段实施特殊字符,最大限制等验证时,将发生此问题。 到那时,与iOS ShouldChangeCharacters委托中的当前输入字段文本字符长度相比,撤消操作将具有额外的字符数。这会导致应用崩溃。 解决方案之一是在这种情况下返回false,而不是禁用撤消按钮。下面的解决方案为我工作。

public class ExtEntryRenderer : EntryRenderer
{
    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
            if (Control != null)
            {
            Control.ShouldChangeCharacters += (UITextField textField, NSRange range, string replacementString) =>
                {
                if (range.Location + range.Length > ((UITextField)textField).Text.Length)
                        return false;
                    return true;
                };
            }                          
    }
}

答案 1 :(得分: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;
                     };
                }
        }
    }
}