我有一个自定义输入字段,可防止在输入字段获得焦点时出现软键盘。然而,这可以防止发生正常的聚焦/非聚焦事件。以下是Android渲染器的代码
Control.FocusChange += (sender, eh) =>
{
new Handler().Post(delegate
{
if (eh.HasFocus)
if (Control != null)
{
var imm =
(InputMethodManager)Control.Context.GetSystemService(Android.Content.Context.InputMethodService);
imm.HideSoftInputFromWindow(Control.WindowToken, 0);
}
});
};
这是Xamarin中的一个错误,还是有办法让焦点和非聚焦事件发生。
答案 0 :(得分:1)
在聚焦DatePicker
或TimePicker
时试图隐藏已经打开的软键盘时,我遇到了同样的问题。 (在某些Android手机中,软键盘位于日期/时间选择器对话框的顶部)。
使用Control.FocusChange
事件处理程序时,未触发打开选择器对话框的默认行为。
解决方案:
隐藏键盘后,在元素上调用Focus()
方法以触发正常的焦点事件和默认行为。
这是我的Android DatePicker渲染器代码:
protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e)
{
base.OnElementChanged(e);
if (Control == null)
{
return;
}
Control.ShowSoftInputOnFocus = false;
Control.FocusChange += (sender, args) => HideSoftKeyboard(e.NewElement, args);
}
private void HideSoftKeyboard(DatePicker e, FocusChangeEventArgs args)
{
if (args.HasFocus)
{
Device.BeginInvokeOnMainThread(() =>
{
var inputMethodManager = Context.GetSystemService(Context.InputMethodService) as InputMethodManager;
inputMethodManager?.HideSoftInputFromWindow(Control.WindowToken, HideSoftInputFlags.None);
e?.Focus();
});
}
}
答案 1 :(得分:0)
根据您的代码,我认为您尝试在UI线程中关闭键盘是正确的,我不确定<DataGrid x:Name="UGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Auto Name" Binding="{Binding AutoName, UpdateSourceTrigger=PropertyChanged}" Width="100"/>
<DataGridTextColumn Header="Color" Binding="{Binding Color, UpdateSourceTrigger=PropertyChanged}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
是否会在此处发生,但您可以使用let originalFont = UIFont(name: "Georgia", size: 15)
// or: UIFont.preferredFont(forTextStyle: .body)
let originalFontDesc = originalFont.fontDescriptor
let italicFontDesc = originalFontDesc.withSymbolicTraits(.traitItalic)
let italicFont = UIFont(descriptor: italicFontDesc, size: 0)
myLabel.font = italicFont
强制执行代码在UI线程上运行:
wait(20000);
此代码可以在我这边工作,new Handler().Post()
事件可以正常触发。