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

.NET MAUI MVVM模式下加载视图时如何让指定Entry控件获焦

在.NET MAUI MVVM中让Entry加载时自动获焦的可行方案

方案1:自定义行为(Behavior)

通过创建一个独立的行为类,绑定到Entry控件上,实现加载时自动获焦,完全不依赖代码后置或ViewModel操作UI控件。

实现步骤

  1. 创建自动获焦行为类:
using Microsoft.Maui.Controls;

public class AutoFocusBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry entry)
    {
        base.OnAttachedTo(entry);
        entry.Loaded += OnEntryLoaded;
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        entry.Loaded -= OnEntryLoaded;
        base.OnDetachingFrom(entry);
    }

    private void OnEntryLoaded(object sender, EventArgs e)
    {
        if (sender is Entry entry)
        {
            // 延迟调度确保控件完成渲染
            entry.Dispatcher.DispatchAsync(() => entry.Focus());
        }
    }
}
  1. 在XAML中引用该行为:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:你的项目命名空间"
             x:Class="你的项目命名空间.目标页面">
    <StackLayout>
        <Entry Placeholder="请输入内容">
            <Entry.Behaviors>
                <local:AutoFocusBehavior />
            </Entry.Behaviors>
        </Entry>
        <Button Text="按钮1" />
        <Button Text="按钮2" />
    </StackLayout>
</ContentPage>

方案2:附加属性(Attached Property)

定义一个可绑定的附加属性,通过XAML直接设置即可让Entry自动获焦,同样遵循MVVM分离原则。

实现步骤

  1. 创建附加属性工具类:
using Microsoft.Maui.Controls;

public static class AutoFocusHelper
{
    public static readonly BindableProperty AutoFocusProperty =
        BindableProperty.CreateAttached(
            "AutoFocus",
            typeof(bool),
            typeof(AutoFocusHelper),
            false,
            propertyChanged: OnAutoFocusChanged);

    public static bool GetAutoFocus(BindableObject bindable)
    {
        return (bool)bindable.GetValue(AutoFocusProperty);
    }

    public static void SetAutoFocus(BindableObject bindable, bool value)
    {
        bindable.SetValue(AutoFocusProperty, value);
    }

    private static void OnAutoFocusChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if (bindable is Entry entry && (bool)newValue)
        {
            entry.Dispatcher.DispatchAsync(() => entry.Focus());
        }
    }
}
  1. 在XAML中启用该属性:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:你的项目命名空间"
             x:Class="你的项目命名空间.目标页面">
    <StackLayout>
        <Entry Placeholder="请输入内容" local:AutoFocusHelper.AutoFocus="True" />
        <Button Text="按钮1" />
        <Button Text="按钮2" />
    </StackLayout>
</ContentPage>

关键说明

  • 使用Dispatcher.DispatchAsync是为了规避视图未完全渲染时调用Focus()无效的问题,确保控件处于可交互状态后再触发焦点。
  • 两种方案都不需要修改ContentPage的代码后置(仅保留ViewModel绑定逻辑即可),也不会让ViewModel直接访问UI控件,完全符合MVVM的关注点分离要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:25:20