.NET MAUI iOS端Entry失焦问题:点击屏幕外部如何取消焦点?
在.NET MAUI iOS端实现点击Entry外部失焦的方案
iOS原生输入控件默认不会在点击外部区域时自动取消焦点,要实现该功能可以通过以下两种方式:
方法一:给单个Entry绑定外部点击失焦逻辑
通过扩展Entry的Handler,针对iOS平台添加专属手势处理:
- 在共享项目中创建扩展类:
public static class EntryExtensions { public static void EnableTapOutsideToDismiss(this Entry entry) { #if IOS entry.HandlerChanged += (sender, e) => { if (entry.Handler?.PlatformView is UIKit.UITextField nativeTextField) { nativeTextField.EditingDidBegin += (textFieldSender, args) => { var keyWindow = UIKit.UIApplication.SharedApplication.KeyWindow; var dismissTap = new UIKit.UITapGestureRecognizer(() => { nativeTextField.ResignFirstResponder(); dismissTap.RemoveTarget(null, null); keyWindow.RemoveGestureRecognizer(dismissTap); }); keyWindow.AddGestureRecognizer(dismissTap); }; } }; #endif } }
- 在使用Entry的页面后台启用该功能:
public YourPage() { InitializeComponent(); MyEntry.EnableTapOutsideToDismiss(); }
这个逻辑会在Entry获得焦点时,给当前窗口添加全局点击手势,触发后让Entry失焦并移除手势,避免重复绑定。
方法二:给页面添加全局点击失焦逻辑
如果页面内所有Entry都需要该功能,可以给整个页面绑定点击手势:
- 在页面XAML中添加手势识别器:
<ContentPage ...> <ContentPage.GestureRecognizers> <TapGestureRecognizer Tapped="PageTappedHandler"/> </ContentPage.GestureRecognizers> <ContentPage.Content> <!-- 页面内容,包含多个Entry --> <Entry Placeholder="输入框1"/> <Entry Placeholder="输入框2"/> </ContentPage.Content> </ContentPage>
- 在页面后台实现点击处理:
private void PageTappedHandler(object sender, EventArgs e) { #if IOS var focusedElement = FocusManager.GetCurrentFocusedElement(); if (focusedElement is Entry focusedEntry) { focusedEntry.Unfocus(); } #endif }
注意事项
- 方法二中,如果页面存在Button、ListView这类自带点击事件的控件,需确保它们的点击优先级高于页面手势,避免被拦截。
- 两种方法都通过
#if IOS指令做平台隔离,不会影响Android等其他平台的原有行为。
内容的提问来源于stack exchange,提问作者Alpay Çalışır
相关产品推荐
相关产品推荐

