Xamarin Forms Entry控件设置带冒号的时间输入格式方法咨询
在Xamarin.Forms Entry中实现自动带冒号的时间输入格式(12:00)
要实现输入时自动插入冒号的时间格式,自定义Behavior是比普通输入掩码更灵活的方案,下面是具体实现:
自定义时间输入Behavior
创建一个继承自Behavior<Entry>的类,监听文本变化事件,自动处理格式、过滤非法字符:
using System.Linq; using Xamarin.Forms; public class TimeEntryBehavior : Behavior<Entry> { protected override void OnAttachedTo(Entry entry) { entry.TextChanged += OnTextChanged; base.OnAttachedTo(entry); } protected override void OnDetachingFrom(Entry entry) { entry.TextChanged -= OnTextChanged; base.OnDetachingFrom(entry); } private void OnTextChanged(object sender, TextChangedEventArgs e) { var entry = sender as Entry; if (entry == null) return; // 移除已有冒号,只保留数字,最多取4位(对应HHmm) var cleanText = new string((e.NewTextValue ?? "").Replace(":", "").Where(char.IsDigit).Take(4).ToArray()); var formattedText = string.Empty; // 逐步构建带冒号的格式 if (cleanText.Length >= 1) { formattedText = cleanText[0].ToString(); if (cleanText.Length >= 2) { formattedText += cleanText[1] + ":"; if (cleanText.Length >= 3) { formattedText += cleanText.Substring(2, Math.Min(2, cleanText.Length - 2)); } } } // 避免循环触发文本变更事件 if (entry.Text != formattedText) { entry.Text = formattedText; // 自动将光标移到文本末尾,提升输入体验 entry.CursorPosition = formattedText.Length; } } }
在页面中使用
在XAML里直接给Entry添加这个Behavior:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:YourAppNamespace" x:Class="YourAppNamespace.TimeEntryPage"> <StackLayout Padding="20"> <Entry Placeholder="例如:12:00" Keyboard="Numeric"> <Entry.Behaviors> <local:TimeEntryBehavior /> </Entry.Behaviors> </Entry> </StackLayout> </ContentPage>
额外优化(可选)
如果需要限制时间合法性(比如12小时制不超过12,24小时制不超过23),可以在处理cleanText时加入验证逻辑:
// 12小时制小时验证 if (cleanText.Length >= 2) { if (int.TryParse(cleanText.Substring(0, 2), out var hour) && (hour > 12 || hour == 0)) { // 自动修正为合法小时,比如超过12则设为12 cleanText = "12" + cleanText.Substring(2); } } // 24小时制小时验证(替换上面的代码) // if (cleanText.Length >= 2) // { // if (int.TryParse(cleanText.Substring(0, 2), out var hour) && hour > 23) // { // cleanText = "23" + cleanText.Substring(2); // } // }
这个方案的优势是完全自定义逻辑,能适配各种输入场景,不会出现普通掩码方案的光标错位、删除异常等问题。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

