我有一个非常简单的用户界面,有一个用于输入电话号码的输入控件和一个按钮。输入控件有一个用于删除其周围边框的处理程序。当输入控件获得焦点时,键盘会弹出。但是,当我尝试点击输入控件外部(例如屏幕空白区域)时,键盘不会消失,输入控件也不会失去焦点。另外,由于该按钮位于屏幕底部,因此,软键盘将其隐藏起来,无法点击该按钮。仅当我按 Android 设备后退按钮时才能点击该按钮。
目前,我还没有在 iOS 设备上检查过此行为。
但这在 Xamarin Forms 中不是问题。在网上查了很多,发现目前是MAUI的一个bug。
我尝试在父布局控件上附加点击手势并调用特定于平台的代码来隐藏键盘,但条目似乎不会失去焦点,因此点击手势事件永远不会被调用。
但是,当我点击输入控件外部(例如在屏幕上)时,输入控件应自动失去焦点,并且软键盘应自动关闭。
如果有的话请提供解决方法。
已知错误。移除焦点有时会有所帮助。有时您需要按顺序执行禁用/启用。 (我选择第二个)。
如果您愿意,您可以阅读以下内容: https://github.com/dotnet/maui/issues/12002
(最令人不安的部分,考虑到这是半年多以来已知的错误)
我们可以在 NET7 中保留目前的行为,并提供一个 NET8 中的 API,允许用户在 iOS 和 安卓
解决方案
private async void OnShowKeyboardTapped(object sender, EventArgs e)
{
EntryInput.Focus();
await Task.Delay(100); // Important to add delay here
Helpers.KeyboardVisibility(true);
}
private async void OnHideKeyboardTapped(object sender, EventArgs e)
{
Helpers.KeyboardVisibility(false);
}
private void KeyboardVisibility(bool StateFocus)
{
#if ANDROID
if (Platform.CurrentActivity.CurrentFocus != null)
{
if (StateFocus)
{
Platform.CurrentActivity.ShowKeyboard(Platform.CurrentActivity.CurrentFocus);
}
else
{ Platform.CurrentActivity.HideKeyboard(Platform.CurrentActivity.CurrentFocus);
Platform.CurrentActivity.CurrentFocus.ClearFocus();
}
}
#endif
}
我遇到了这个问题。这是我解决问题的方法:
Entry entry = new Entry { };
void OnEntryCompleted(object sender, EventArgs e) {
string text = ((Entry)sender).Text;
entry.IsEnabled = false;
entry.IsEnabled = true;
}
entry.Completed += OnEntryCompleted;
具体来说,当按下“完成”按钮 (entry.Completed) 时,将 .IsEnabled 设置为 false,从而关闭虚拟键盘。这将完全禁用输入字段,但保留已输入的值。我确保将 .IsEnabled 设置回 true,以便用户可以再次编辑该字段。
希望这有帮助。
使用 .NET8
ContentPage
具有 HideSoftInputOnTapped
属性。如果您将其设置为 true
,键盘将在触摸页面上的任何位置时消失。
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
HideSoftInputOnTapped="True"
x:Class="MyApp.MainPage">
<Entry />
</ContentPage>