You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:20:41