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

如何在.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需要该功能,推荐封装自定义控件,避免重复代码:

  1. 共享项目中创建自定义Entry:
namespace YourAppNamespace.Controls;

public class NoKeyboardEntry : Entry
{
}
  1. 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);
    }
}
  1. 在MauiProgram.cs中注册Handler:
builder.ConfigureMauiHandlers(handlers =>
{
#if WINDOWS
    handlers.AddHandler(typeof(NoKeyboardEntry), typeof(NoKeyboardEntryHandler));
#endif
});
  1. 在XAML中直接使用:
<controls:NoKeyboardEntry 
    Placeholder="不会弹出虚拟键盘的输入框"
    Text="支持焦点、选中文本、复制粘贴" />

以上两种方案都能保证Entry正常获取焦点,支持文本选择、复制粘贴等交互,不会出现禁用控件导致的不可用问题。

内容的提问来源于stack exchange,提问作者Igor. A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:24