Xamarin.ios 键盘打开时的Xamarin按钮命令

Xamarin.ios 键盘打开时的Xamarin按钮命令,xamarin.ios,keyboard,xamarin.forms,Xamarin.ios,Keyboard,Xamarin.forms,我正在从事一个专门针对iOS平台的Xamarin.Forms项目。我有一个编辑器控件和一个按钮控件。当我聚焦编辑器时,输入一些文本,然后单击按钮,似乎命令没有被触发,而键盘只是在关闭。然后,我必须再次点击add按钮才能触发命令 我尝试创建一个自定义渲染器,以防止键盘最初关闭,然后在延迟后关闭。这允许启动命令,但我被键盘打开卡住了 公共类键盘编辑程序 { 受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.Property

我正在从事一个专门针对iOS平台的Xamarin.Forms项目。我有一个
编辑器
控件和一个
按钮
控件。当我聚焦编辑器时,输入一些文本,然后单击按钮,似乎命令没有被触发,而键盘只是在关闭。然后,我必须再次点击add按钮才能触发命令


我尝试创建一个自定义渲染器,以防止键盘最初关闭,然后在延迟后关闭。这允许启动命令,但我被键盘打开卡住了

公共类键盘编辑程序
{
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
if(e.PropertyName==VisualElement.IsFocusedProperty.PropertyName)
{
if(控件!=null)
{
Control.ShouldEndEditing=(UITextView文本字段)=>
{
任务。延迟(10)。继续(\u=>
{
//这行不通
textField.EndEditing(true);
});
返回false;
};
}
}
base.OnElementPropertyChanged(发送方,e);
}
}
我的理想解决方案是,您可以输入文本,点击添加按钮,键盘关闭,命令同时执行。关于如何实现这一点有什么想法吗

编辑:原来问题出在我用于页面的自定义渲染器上。自定义呈现器在键盘出现时调整页面大小,使其不覆盖“我的编辑器”字段

public类KeyboardPageRenderer:PageRenderer
{
私人键盘显示;
私有对象键盘将显示;
私有对象键盘将隐藏;
私人双倍期限;
私有UIViewAnimationCurve曲线;
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
this.keyboardWillShow=UIKeyboard.Notifications.ObserveWillShow(this.keyboardWillShow);
this.keyboardWillHide=ui键盘.Notifications.ObserveWillHide(this.keyboardWillHide);
}
公共覆盖无效视图消失(布尔动画)
{
base.viewdiddemove(动画);
此.keyboard将显示.Dispose();
此.keyboard将隐藏.Dispose();
}
私有void KeyboardWillShow(对象发送方,UIKeyboardEventArgs args args)
{
如果(!此.键盘显示)
{
this.keyboardShowing=true;
var keyboardFrame=UIKeyboard.framebeginfoomnotification(args.Notification);
this.duration=args.AnimationDuration;
this.curve=args.AnimationCurve;
这个.ScrollTheView(true,keyboardFrame.Height);
}
}
私有void KeyboardWillHide(对象发送方,UIKeyboardEventArgs args args)
{
如果(此键盘显示)
{
此.keyboardShowing=false;
var keyboardFrame=UIKeyboard.framebeginfoomnotification(args.Notification);
this.duration=args.AnimationDuration;
this.curve=args.AnimationCurve;
此.ScrollTheView(false,keyboardFrame.Height);
}
}
私有无效滚动视图(布尔比例、非浮动滚动量)
{
UIView.BeginAnimations(string.Empty,IntPtr.Zero);
UIView.SetAnimationDuration(this.duration);
UIView.SetAnimationCurve(this.curve);
var frame=View.frame;
//假定页面属于选项卡式视图。
//这不会缩放到没有页面的页面。
UITabBarController tabBarController=新的UITabBarController();
nfloat tabHeight=tabBarController.TabBar.Frame.Size.Height;
滚动量-=选项卡高度;
如果(比例)
{
frame.Y-=滚动量;
}
其他的
{
frame.Y+=滚动量;
}
视图。帧=帧;
UIView.CommitAnimations();
}
}

您的方法中有两个问题

  • Task.Delay(10)
    之后,您不再在UI线程上,这意味着您必须使用
    Device.beginInvokeMainThread
    才能访问UI元素
  • Control.ShouldEndEditing
    必须在调用
    EndEditing
可行的解决方案如下所示:

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    if (Element == null || Control == null)
        return;

    VisualElement element = Element as VisualElement;
    if (element == null)
        return;

    if (e.PropertyName == VisualElement.IsFocusedProperty.PropertyName && element.IsFocused == false)
    {
        Control.ShouldEndEditing = (UITextView control) =>
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                control.ShouldEndEditing = null;
                control.EndEditing(true);
            });

            // prevent the keyboard from closing
            return false;
        };
    }
}

Mike当我在iOS上的测试项目上尝试Xaml时,没有自定义渲染器,我的命令被触发。这是在真正的设备上。我点击编辑器,键入一些文本,然后点击按钮。键盘消失,命令启动(我记录绑定的
EditorText
)中的文本。你说得对。这就解决了我的问题,实际上我的内容页也使用了自定义的渲染器。自定义渲染器用于在键盘显示时调整页面大小,或者键盘位于底部,因此与编辑器重叠。我将把这个自定义渲染器添加到我的问题中。