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

.NET MAUI自定义ContentView中Entry焦点设置问题求助

.NET MAUI Entry控件焦点跳转问题解决方案

直接通过x:Name引用控件实现跳转

确保在XAML中给每个Entry设置正确的x:Name属性,然后在Completed事件处理方法中直接调用Focus():

<StackLayout>
    <Label Text="时间输入"/>
    <Entry x:Name="enHoras" Completed="OnHorasCompleted" Placeholder="小时"/>
    <Entry x:Name="enMinutos" Completed="OnMinutosCompleted" Placeholder="分钟"/>
    <Entry x:Name="enSegundos" Placeholder="秒"/>
</StackLayout>
private void OnHorasCompleted(object sender, EventArgs e)
{
    enMinutos.Focus();
}

private void OnMinutosCompleted(object sender, EventArgs e)
{
    enSegundos.Focus();
}

如果提示控件不存在,检查两个关键点:

  • XAML中x:Name的拼写和后台代码中的引用完全一致
  • 确保ContentView的后台代码类和XAML的x:Class属性命名空间、类名完全匹配

通过VisualTreeHelper遍历查找下一个Entry

如果控件结构复杂,无法直接通过x:Name引用,可通过遍历父容器的子控件获取下一个Entry:

private Entry FindNextEntry(Entry currentEntry)
{
    var parentLayout = currentEntry.Parent as Layout;
    if (parentLayout == null) return null;

    // 获取父容器下所有Entry控件
    var entryList = parentLayout.Children.OfType<Entry>().ToList();
    var currentIndex = entryList.IndexOf(currentEntry);
    
    // 返回下一个同级Entry
    if (currentIndex >= 0 && currentIndex < entryList.Count - 1)
    {
        return entryList[currentIndex + 1];
    }
    return null;
}

在Completed事件中调用该方法:

private void OnEntryCompleted(object sender, EventArgs e)
{
    var currentEntry = sender as Entry;
    var nextEntry = FindNextEntry(currentEntry);
    nextEntry?.Focus();
}

注意:此方法要求所有Entry处于同一个Layout容器(如StackLayout、Grid)下,才能正确获取同级控件列表。

使用Behavior实现通用焦点跳转

通过自定义Behavior实现复用性更强的焦点跳转逻辑,避免重复编写事件处理代码:

public class NextEntryFocusBehavior : Behavior<Entry>
{
    public static readonly BindableProperty NextEntryProperty =
        BindableProperty.Create(nameof(NextEntry), typeof(Entry), typeof(NextEntryFocusBehavior));

    public Entry NextEntry
    {
        get => (Entry)GetValue(NextEntryProperty);
        set => SetValue(NextEntryProperty, value);
    }

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

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

    private void OnEntryCompleted(object sender, EventArgs e)
    {
        NextEntry?.Focus();
    }
}

在XAML中引用该Behavior:

<ContentPage xmlns:local="clr-namespace:YourAppNamespace">
    <StackLayout>
        <Entry x:Name="enHoras">
            <Entry.Behaviors>
                <local:NextEntryFocusBehavior NextEntry="{x:Reference enMinutos}" />
            </Entry.Behaviors>
        </Entry>
        <Entry x:Name="enMinutos">
            <Entry.Behaviors>
                <local:NextEntryFocusBehavior NextEntry="{x:Reference enSegundos}" />
            </Entry.Behaviors>
        </Entry>
        <Entry x:Name="enSegundos" />
    </StackLayout>
</ContentPage>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:45:04