.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
相关产品推荐
相关产品推荐

