Xamarin,覆盖自定义渲染器中的焦点更改会停止焦点事件的发生

时间:2017-04-12 14:15:34

标签: android xamarin xamarin.android

我有一个自定义输入字段,可防止在输入字段获得焦点时出现软键盘。然而,这可以防止发生正常的聚焦/非聚焦事件。以下是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中的一个错误,还是有办法让焦点和非聚焦事件发生。

2 个答案:

答案 0 :(得分:1)

在聚焦DatePickerTimePicker时试图隐藏已经打开的软键盘时,我遇到了同样的问题。 (在某些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()事件可以正常触发。