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

.NET MAUI:ControlTemplate获焦时如何让EntryFilter自动获焦?

MAUI自定义控件获焦时让ControlTemplate内Entry自动获焦问题解决

问题背景

我有一个包含Entry和ListView的ControlTemplate(代码如下),期望当自定义控件controls:QuickSearch获得焦点时,内部的EntryFilter自动获取焦点。尝试在Style的Triggers中配置触发器但无法生效,同时不清楚MAUI Toolkit的SetFocusOnEntryCompletedBehavior该如何正确使用。

原ControlTemplate代码:

<Style TargetType="controls:QuickSearch">
    <Setter Property="ControlTemplate">
        <Setter.Value>
            <ControlTemplate>
                <VerticalStackLayout HorizontalOptions="Fill">
                    <Entry
                        x:Name="EntryFilter"
                        Text="{TemplateBinding Filter}"
                        Completed="Entry_Completed"
                        Focused="Entry_Focused"
                        ClearButtonVisibility="WhileEditing"
                        Placeholder="{TemplateBinding PlaceHolder,Mode=TwoWay}">
                        <Entry.Triggers>
                            <EventTrigger Event="Completed">
                            </EventTrigger>
                        </Entry.Triggers>
                    </Entry>
                    <ListView
                        x:Name="LstResults"
                        Margin="5"
                        Background="{DynamicResource PN_ColorFondoPrimario}"
                        ZIndex="999"
                        ItemsSource="{TemplateBinding Results}"
                        SelectionMode="Single"
                        SelectedItem="{TemplateBinding SelectedItem,Mode=TwoWay}"
                        IsVisible="{TemplateBinding PerforminigSearch}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <Label Text="{Binding DisplayField}" Margin="9"/>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </VerticalStackLayout>
                <ControlTemplate.Triggers>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

无效的Style触发器尝试:

<Style TargetType="controls:QuickSearch">
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter TargetName="EntryFilter" Property="IsFocused" Value="True"/>
        </Trigger>
    </Style.Triggers>
    <!-- 省略其余代码 -->
</Style>

解决方案

1. 使用ControlTemplate内部触发器(核心解决方法)

Style的触发器无法跨作用域访问ControlTemplate内部的命名控件,正确做法是将触发器放在ControlTemplate.Triggers内部,这样可以直接监听自定义控件的IsFocused属性,并控制模板内的EntryFilter:

<ControlTemplate>
    <!-- 原有布局代码保持不变 -->
    <VerticalStackLayout HorizontalOptions="Fill">
        <!-- Entry和ListView代码省略 -->
    </VerticalStackLayout>

    <ControlTemplate.Triggers>
        <Trigger TargetType="controls:QuickSearch" Property="IsFocused" Value="True">
            <Setter TargetName="EntryFilter" Property="IsFocused" Value="True" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

2. SetFocusOnEntryCompletedBehavior的正确使用(补充需求)

该行为的作用是Entry输入完成(按下回车)后自动跳转焦点到指定控件,和当前需求不直接匹配,但如果需要完善输入完成后的焦点逻辑,直接将其附加到EntryFilter即可:

<Entry x:Name="EntryFilter">
    <Entry.Behaviors>
        <behaviors:SetFocusOnEntryCompletedBehavior NextElement="{x:Reference LstResults}" />
    </Entry.Behaviors>
    <!-- 其余Entry属性省略 -->
</Entry>

3. 后台代码手动处理(备选方案)

如果触发器方式存在兼容性问题,可在自定义控件后台监听IsFocused属性变化,手动设置Entry焦点:

public partial class QuickSearch : ContentView
{
    public QuickSearch()
    {
        InitializeComponent();
        PropertyChanged += QuickSearch_PropertyChanged;
    }

    private void QuickSearch_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(IsFocused) && IsFocused)
        {
            var entry = FindByName<Entry>("EntryFilter");
            entry?.Focus();
        }
    }
}

内容的提问来源于stack exchange,提问作者Juan Pablo Gomez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:01:02