Я хотел бы знать, какая клавиша нажата на мобильной клавиатуре, но @onkeyup срабатывает только при нажатии мобильного эквивалента ввода, при этом KeyboardEventArgs.Code соответствует пустой строке. Я пытался найти любую информацию о мобильном эквиваленте KeyboardEventArgs или даже о том, почему @onkeyup не срабатывает при нажатии каждой клавиши, несмотря на то, что onkeyup = "this.value = this.value.toUpperCase()" работает над каждым нажатием клавиши нормально. Я откровенно сбит с толку.
HTML-код, который работает:
<input @bind = "StringInput" id = "textInput" onkeyup = "this.value = this.value.toUpperCase()" />
Код Blazor, который я пробовал:
<input @bind = "StringInput" id = "textInput" @onkeyup = "InputReceivedInput" />
@code {
private string StringInput = string.Empty;
private void InputReceivedInput(KeyboardEventArgs Args)
{
if (Args.Code == "Enter" || Args.Code == "NumpadEnter")
{
//call another function
}
else
{
StringInput = StringInput.ToUpper();
}
}
}
Вторая попытка (только измененная часть HTML):
<input @bind = "StringInput" id = "textInput" onkeyup = "@InputReceivedInput" />
Это отстой. Есть ли функция ontextchange, которую я мог бы использовать вместо этого? Может быть, я смогу каждый раз проверять его на '\n'...
Вы можете использовать событие TextChange: «Кроме того, InputView определяет событие TextChanged, которое возникает при изменении текста в записи. Объект TextChangedEventArgs, который сопровождает событие TextChanged, имеет свойства NewTextValue и OldTextValue, которые определяют новый и старый текст соответственно. .». См.: Learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/…






Я протестировал предоставленный вами код, и у метода onkeyup возникла проблема: он не может обновить данные после нажатия кнопки на клавиатуре. Об этой проблеме вы можете сообщить об этой проблеме на GitHub.
Кроме того, я нашел еще один способ добиться этого: используя @bind:get и @bind:set. Для получения дополнительной информации вы можете проверить этот документ о привязке данных ASP.NET Core Blazor.
<input @bind:event = "oninput" @bind:get = "StringInput" @bind:set = "OnInput" id = "textInput" />
<p>
<code>StringInput</code>: @StringInput
</p>
<input @bind = "StringInput" id = "textInput" onkeyup = "this.value = this.value.toUpperCase()" />
@code {
private string StringInput = string.Empty;
private void OnInput(string value)
{
var newValue = value ?? string.Empty;
StringInput = newValue.ToUpper();
}
}
К сожалению, хотя этот код по-прежнему не позволяет мне определить, когда была нажата клавиша ввода, альтернатива, которую вы нашли с помощью @bind:get и @bind:set, позволяет тексту появляться на экране в верхнем регистре, а не сначала отображаться в нижнем регистре, а затем обновляться. Спасибо!
Я думаю, что это практически невозможно, согласно документации Android: «Поскольку методы мягкого ввода могут использовать несколько изобретательных способов ввода текста, нет никакой гарантии, что любое нажатие клавиши на программной клавиатуре сгенерирует ключевое событие: это оставлено на усмотрение пользователя». На усмотрение IME, и на самом деле отправка таких событий не рекомендуется. Никогда не следует рассчитывать на получение KeyEvents для любой клавиши при программном методе ввода. В частности, программная клавиатура по умолчанию никогда не будет отправлять какие-либо события клавиш в любое приложение, предназначенное для Jelly Bean или более поздней версии. ..». См.: Developer.android.com/reference/android/view/KeyEvent