蒙面入口控制Xamarin.forms

时间:2016-05-04 07:58:02

标签: c# xamarin.forms

Xamarin.forms的屏蔽输入控件。我想有一个输入字段,只允许以格式添加值:xx:xx例如:01:00,25:98等我尝试将键盘属性设置为数字,但它没有帮助,因为它没有包含:

我该怎么做?我的目标是所有平台,所以应该适用于所有平台。

1 个答案:

答案 0 :(得分:2)

你想要一个只带有那些控件的特殊键盘,或者只是一个只显示那些字符的条目,无论你输入什么字符?如果后者没问题,我建议在你的参赛作品中添加一个行为。

下面的代码将允许用户键入他们想要的任何内容,但如果他们键入的内容不是数字或冒号,那么它不会显示在条目中,您还可以显示某种错误消息你想要的。

/// <summary>
/// Will validate that the text entered into an Entry is a valid number string (allowing: numbers and colons).
/// </summary>
public class IntColonValidationBehavior : Behavior<Entry> {

    public static IntColonValidationBehavior Instance = new IntColonValidationBehavior();

    /// <summary>
    /// Attaches when the page is first created.
    /// </summary>
    protected override void OnAttachedTo(Entry entry) {
        entry.TextChanged += OnEntryTextChanged;
        base.OnAttachedTo(entry);
    }

    /// <summary>
    /// Detaches when the page is destroyed.
    /// </summary>
    protected override void OnDetachingFrom(Entry entry) {
        entry.TextChanged -= OnEntryTextChanged;
        base.OnDetachingFrom(entry);
    }

    private void OnEntryTextChanged(object sender, TextChangedEventArgs args) {

        if(!string.IsNullOrWhiteSpace(args.NewTextValue)) {
            int  result;
            string valueWithoutColon = args.NewTextValue.Replace(":", string.Empty);
            bool isValid = int.TryParse(valueWithoutColon, out result);

            ((Entry)sender).Text = isValid ? args.NewTextValue : args.NewTextValue.Remove(args.NewTextValue.Length - 1);
        }
    }
}

然后您的参赛作品将如此:

<Entry Placeholder="Enter an int or a colon">
    <Entry.Behaviors>
        <local:IntColonValidationBehavior.Instance />
    </Entry.Behaviors>
</Entry>

-OR -

Entry entry = new Entry { Placeholder = "Enter an int or a colon" };
entry.Behaviors.Add (IntColonValidationBehavior.Instance);

*编辑:

也许用这个替换string.IsNullOrEmpty if语句(实际上没有经过测试,但您可以调整它以使其适合您):

        if(!string.IsNullOrWhiteSpace(args.NewTextValue)) {
            int  result;
            string[] splitValue = args.NewTextValue.Split(new [] { ":" }, StringSplitOptions.RemoveEmptyEntries);

            foreach(string value in splitValue) {
                if(value.Length > 2) {
                    ((Entry)sender).Text = args.NewTextValue.Remove(args.NewTextValue.Length - 1);
                    return;
                }

                bool isValid = int.TryParse(args.NewTextValue, out result);

                if(!isValid) {
                    ((Entry)sender).Text = args.NewTextValue.Remove(args.NewTextValue.Length - 1);
                    return;
                }
            }


            ((Entry)sender).Text = args.NewTextValue;
        }