Xamarin.Forms条目不应重点显示SoftKeyboard

时间:2018-11-26 22:46:10

标签: android ios xamarin.forms soft-keyboard

我正在处理Xamarin Forms项目,并且正在使用Entry视图,这是必需的,因为我需要能够专注于它,但是这也要求不显示软键盘。

此要求无法更改。另外,我无法使用“标签”或“按钮”代替“输入”,因为它们没有获得焦点。

在这篇文章(https://theconfuzedsourcecode.wordpress.com/2017/05/19/a-keyboard-disabled-entry-control-in-xamarin-forms/comment-page-1/#comment-1300)之后,我尝试创建自定义渲染器并在Android上使用ShowSoftInputOnFocus,但这会短暂显示,然后隐藏软键盘。这不是一个选择,因为我的要求是严格禁止在此自定义输入字段上完全不显示软键盘。

因此,我在Xamarin.Forms项目(.NET Standard 2.0)中创建了自定义KeyboardlessEntry

namespace MyProjNamespace
{
    public class KeyboardlessEntry : Entry
    {
    }
}

,然后是Xamarin.Droid head项目中的自定义KeyboardlessEntryRenderer渲染器,如下所示:

[assembly: ExportRenderer(typeof(KeyboardlessEntry), typeof(KeyboardlessEntryRenderer))]
namespace MyProjNamespace.Droid
{
    public class KeyboardlessEntryRenderer : EntryRenderer
    {
        //as of latest Xamarin.Forms need to provide c-tor that
        //receives Android Context and sets it in base
        public KeyboardlessEntryRenderer (Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                ((KeyboardlessEntry)e.NewElement).PropertyChanging += OnPropertyChanging;
            }

            if (e.OldElement != null)
            {
                ((KeyboardlessEntry)e.OldElement).PropertyChanging -= OnPropertyChanging;
            }

            this.Control.ShowSoftInputOnFocus = false; // disable soft keyboard on focus
        }

        private void OnPropertyChanging(object sender, PropertyChangingEventArgs propertyChangingEventArgs)
        {
            if (propertyChangingEventArgs.PropertyName == VisualElement.IsFocusedProperty.PropertyName)
            {
                // fully dismiss the soft keyboard 
                InputMethodManager imm = (InputMethodManager)this.Context.GetSystemService(Context.InputMethodService);
                imm.HideSoftInputFromWindow(this.Control.WindowToken, 0);
            }
        }
    }
}

如您所见,我在ShowSoftInputOnFocus覆盖中设置了OnElementChanged,但这并不能因为某些原因阻止它显示。我的键盘仍然显示在KeyboardlessEntry焦点上,然后消失了,因为我在HideSoftInputFromWindow事件中调用了OnPropertyChanging

我不确定为什么这不起作用。我希望像上面一样将ShowSoftInputOnFocus设置为false会完全禁止软键盘显示。有人声称这可以在Android或Xamarin.Android上使用,但在Xamarin.Forms中不可用。

iOS上的类似问题,这是iOS的渲染器

[程序集:ExportRenderer(typeof(KeyboardlessEntry),typeof(KeyboardlessEntryRenderer))] 命名空间Squirrel.FoH.App.iOS.Implementations.Controls {     公共类KeyboardlessEntryRenderer:EntryRenderer     {         公共KeyboardlessEntryRenderer()         {         }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        this.Control.InputView = new UIView(); // disable soft keyboard
    }
}

}

这也会显示,然后将键盘缩小至下方,但请注意,没有按钮可以完全将其关闭,从而更加烦人

enter image description here

1 个答案:

答案 0 :(得分:0)

尝试将其添加到您的KeyboardlessEntryRenderer类中:

public KeyboardlessEntryRenderer (Context context) : base(context)
{
}