如何在.NET 8 MAUI Windows应用中禁用Entry虚拟键盘?
.NET 8 MAUI Windows Surface 禁用Entry虚拟键盘且保留焦点的方案
方案一:给目标Entry添加平台特定的键盘禁用逻辑
在Windows项目中创建工具类,封装针对Entry的键盘禁用逻辑:
using Microsoft.Maui.Handlers; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; namespace YourAppNamespace.Platforms.Windows; public static class EntryKeyboardHelper { public static void DisableVirtualKeyboard(this Entry entry) { entry.HandlerChanged += (s, e) => { if (entry.Handler?.PlatformView is TextBox textBox) { // 设置输入范围为None,从源头阻止虚拟键盘触发 var inputScope = new InputScope(); var inputScopeName = new InputScopeName { NameValue = InputScopeNameValue.None }; inputScope.Names.Add(inputScopeName); textBox.InputScope = inputScope; // 兜底处理:获取焦点时主动隐藏键盘 textBox.GotFocus += (sender, args) => { var currentWindow = Microsoft.UI.Xaml.Window.Current; currentWindow.CoreWindow.HideSoftInput(Windows.UI.Core.CoreInputDeviceTypes.Touch); }; } }; } }
在需要禁用键盘的Entry初始化时调用该扩展方法(比如页面构造函数或Entry的Loaded事件中):
// 假设你的Entry名为targetEntry targetEntry.DisableVirtualKeyboard();
方案二:封装自定义NoKeyboardEntry控件
如果多个Entry需要该功能,推荐封装自定义控件,避免重复代码:
- 共享项目中创建自定义Entry:
namespace YourAppNamespace.Controls; public class NoKeyboardEntry : Entry { }
- Windows项目中实现自定义Handler:
using Microsoft.Maui.Handlers; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; namespace YourAppNamespace.Platforms.Windows; public class NoKeyboardEntryHandler : EntryHandler { protected override void ConnectHandler(TextBox platformView) { base.ConnectHandler(platformView); // 配置输入范围阻止键盘弹出 var inputScope = new InputScope(); var inputScopeName = new InputScopeName { NameValue = InputScopeNameValue.None }; inputScope.Names.Add(inputScopeName); platformView.InputScope = inputScope; // 绑定焦点事件兜底隐藏键盘 platformView.GotFocus += OnPlatformViewGotFocus; } private void OnPlatformViewGotFocus(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) { var currentWindow = Microsoft.UI.Xaml.Window.Current; currentWindow.CoreWindow.HideSoftInput(Windows.UI.Core.CoreInputDeviceTypes.Touch); } protected override void DisconnectHandler(TextBox platformView) { platformView.GotFocus -= OnPlatformViewGotFocus; base.DisconnectHandler(platformView); } }
- 在MauiProgram.cs中注册Handler:
builder.ConfigureMauiHandlers(handlers => { #if WINDOWS handlers.AddHandler(typeof(NoKeyboardEntry), typeof(NoKeyboardEntryHandler)); #endif });
- 在XAML中直接使用:
<controls:NoKeyboardEntry Placeholder="不会弹出虚拟键盘的输入框" Text="支持焦点、选中文本、复制粘贴" />
以上两种方案都能保证Entry正常获取焦点,支持文本选择、复制粘贴等交互,不会出现禁用控件导致的不可用问题。
内容的提问来源于stack exchange,提问作者Igor. A
相关产品推荐
相关产品推荐

