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

Xamarin.Forms中基于Behavior实现Entry完成后条件切换焦点

解决方案

要实现根据验证结果决定是否切换焦点的功能,你可以在原有Behavior基础上添加一个验证逻辑的绑定属性,通过该属性传入自定义验证规则,根据验证结果决定是否跳转焦点或保持当前输入框的焦点。

修改后的Behavior代码

using System;
using Xamarin.Forms;

namespace NextFormFieldSample.Forms.Behaviors
{
    public class SetFocusOnEntryCompletedBehavior : Behavior<Entry>
    {
        // 目标控件绑定属性
        public static readonly BindableProperty TargetElementProperty = BindableProperty.Create(
            nameof(TargetElement),
            typeof(VisualElement),
            typeof(SetFocusOnEntryCompletedBehavior),
            defaultValue: null);

        // 验证逻辑绑定属性:接收当前Entry,返回bool表示是否允许跳转焦点
        public static readonly BindableProperty ValidationFuncProperty = BindableProperty.Create(
            nameof(ValidationFunc),
            typeof(Func<Entry, bool>),
            typeof(SetFocusOnEntryCompletedBehavior),
            defaultValue: null);

        public VisualElement TargetElement
        {
            get => (VisualElement)GetValue(TargetElementProperty);
            set => SetValue(TargetElementProperty, value);
        }

        public Func<Entry, bool> ValidationFunc
        {
            get => (Func<Entry, bool>)GetValue(ValidationFuncProperty);
            set => SetValue(ValidationFuncProperty, value);
        }

        protected override void OnAttachedTo(Entry entry)
        {
            base.OnAttachedTo(entry);
            entry.Completed += Entry_Completed;
        }

        protected override void OnDetachingFrom(Entry entry)
        {
            entry.Completed -= Entry_Completed;
            base.OnDetachingFrom(entry);
        }

        private void Entry_Completed(object sender, EventArgs e)
        {
            if (sender is not Entry currentEntry) return;

            bool allowFocusSwitch = true;
            // 如果设置了验证逻辑,执行验证并获取结果
            if (ValidationFunc != null)
            {
                allowFocusSwitch = ValidationFunc.Invoke(currentEntry);
            }

            if (allowFocusSwitch && TargetElement != null)
            {
                // 验证通过,跳转到目标控件
                TargetElement.Focus();
            }
            else if (!allowFocusSwitch)
            {
                // 验证不通过,重新聚焦当前输入框,保持焦点
                currentEntry.Focus();
            }
        }
    }
}

XAML中的使用示例

1. 页面后台绑定验证逻辑

先给ContentPage设置x:Name,方便绑定后台方法:

<ContentPage x:Class="NextFormFieldSample.Forms.MainPage"
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:behaviors="clr-namespace:NextFormFieldSample.Forms.Behaviors"
             x:Name="MainPage">
    <StackLayout Margin="20">   
        
        <Entry Placeholder="Field 1">
            <Entry.Behaviors>
                <behaviors:SetFocusOnEntryCompletedBehavior 
                    TargetElement="{x:Reference Entry2}"
                    ValidationFunc="{Binding ValidateField1, Source={x:Reference MainPage}}"/>
            </Entry.Behaviors>
        </Entry>

        <Entry x:Name="Entry2" Placeholder="Field 2"/>  
        
    </StackLayout>
</ContentPage>

在页面后台(MainPage.xaml.cs)添加验证方法:

// 示例验证:Field1不能为空
public bool ValidateField1(Entry entry)
{
    return !string.IsNullOrWhiteSpace(entry.Text);
}

2. MVVM模式下的使用

如果采用MVVM,可以在ViewModel中定义验证方法,通过DataContext绑定:

<Entry Placeholder="Field 1">
    <Entry.Behaviors>
        <behaviors:SetFocusOnEntryCompletedBehavior 
            TargetElement="{x:Reference Entry2}"
            ValidationFunc="{Binding ValidateField1}"/>
    </Entry.Behaviors>
</Entry>

ViewModel中的验证方法:

public bool ValidateField1(Entry entry)
{
    // 根据业务逻辑自定义验证规则,比如检查输入长度、格式等
    return !string.IsNullOrWhiteSpace(entry.Text) && entry.Text.Length >= 3;
}

逻辑说明

  • 新增的ValidationFunc属性允许你传入自定义验证逻辑,该逻辑接收当前触发Completed事件的Entry,返回bool值:
    • 返回true:执行原焦点切换逻辑,跳转到TargetElement
    • 返回false:重新聚焦当前Entry,保持焦点不跳转
  • 若未设置ValidationFunc,则默认允许焦点切换,保留原有Behavior的功能

内容的提问来源于stack exchange,提问作者COMAVLER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:40:22