У меня есть приложение со штрих-кодом, в котором мне нужно отключить клавиатуру для контроля входа.
Я нашел это, и оно отлично работает. Запретить открытие программной клавиатуры при нажатии на поле ввода в MAUI?
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("NoKeyboardEntry", (handler, entry) =>
{
#if ANDROID
handler.PlatformView.ShowSoftInputOnFocus = false;
#endif
})
Но мне также приходится поддерживать режим ручного ввода.
Я попробовал это, но это не работает.
MyEntry.ShowKeyboardAsync(CancellationToken.None);
Как включить клавиатуру во время работы приложения после ее отключения при запуске с помощью этого метода?
Редактировать: Так много людей спрашивали о том, как с этим справиться, поэтому вот мое решение о том, как использовать запись для получения входных данных сканирования штрих-кода HID. У меня есть флажок «Сохранить фокус», который, если он установлен, удерживает фокус на элементе «Ввод» и ПОЛНОСТЬЮ ОТКЛЮЧАЕТ отображение программной клавиатуры для одного элемента управления «Ввод»! Если флажок снят, клавиатура снова включается для ввода. Идеальный!
ОГРОМНОЕ спасибо Лиюнь Чжану за включение/отключение клавиатуры.
// For HID barcode scanning
// Checking this checkbox will
// Keep the focus on the barcode Entry and
// Also disable the Entry keyboard!
<CheckBox x:Name = "cb_KeepFocus" CheckedChanged = "OnKeepFocusClicked"/>
// Entry that accepts the HID barcode
<Entry x:Name = "tx_ConfirmationNumber"/>
public MainPage()
{
InitializeComponent();
// If the barcode Entry looses focus set it back every 3 seconds
var KeepFocusTimer = Application.Current.Dispatcher.CreateTimer();
KeepFocusTimer.Interval = TimeSpan.FromSeconds(3);
KeepFocusTimer.Tick += (s, e) => OnKeepFocusTimer();
KeepFocusTimer.Start();
}
private void OnKeepFocusTimer()
{
MainThread.BeginInvokeOnMainThread(() =>
{
if (cb_KeepFocus.IsChecked)
// Only set the focus if it isn't already set
if (!tx_ConfirmationNumber.IsFocused)
tx_ConfirmationNumber.Focus();
});
}
// Turns on and off the keep focus and keyboard for the HID Entry
private void OnKeepFocusClicked(object sender, CheckedChangedEventArgs e)
{
if (cb_KeepFocus.IsChecked && (!tx_ConfirmationNumber.IsFocused))
tx_ConfirmationNumber.Focus();
if (cb_KeepFocus.IsChecked)
DisableKeyboard();
else
EnableKeyboard();
}
private void DisableKeyboard()
{
#if ANDROID
(tx_ConfirmationNumber.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = false;
#endif
}
private void EnableKeyboard()
{
#if ANDROID
(tx_ConfirmationNumber.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = true;
#endif
}
Самый простой способ сделать это — использовать следующий код:
#if ANDROID
( MyEntry.Handler.PlatformView as AndroidX.AppCompat.Widget.AppCompatEditText).ShowSoftInputOnFocus = true;
#endif
И вы также можете настроить обработчик, чтобы отключить или включить его:
CustomHandler.cs:
namespace MauiAppTest.Platforms.Android
{
public class MyHandler : EntryHandler
{
public void DisableKeyboard()
{
PlatformView.ShowSoftInputOnFocus = false;
}
public void EnableKeyboard()
{
PlatformView.ShowSoftInputOnFocus = true;
}
}
}
Используйте его в MauiProgram.cs:
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
.ConfigureMauiHandlers((handlers) =>
{
#if ANDROID
handlers.AddHandler(typeof(Entry),typeof(Platforms.Android.MyHandler));
#endif
});
Вызовите метод в коде:
#if ANDROID
(MyEntry.Handler as Platforms.Android.MyHandler).DisableKeyboard();
#endif
Кроме того, когда вы меняете свойство, вам необходимо перефокусировать запись, чтобы отобразить KeyBoard.