Xamarin Forms Entry调用Completed事件

时间:2017-01-07 10:19:04

标签: c# android xamarin xamarin.forms

我目前正在使用Xamarin Forms中的登录和注册页面,在将键盘的完成按钮更改为下一个并继续操作后,我不再接收Android上的已完成事件(工作正常iOS版)。在自定义渲染器中,我可以捕获Control.EditorAction事件,该事件现在与Completed事件的行为相同,但我似乎无法在条目本身上调用Completed事件。

在EntryRenderer中

Control.EditorAction += (object sender, TextView.EditorActionEventArgsargs) =>
{
    if (entryExt.ReturnKeyType != ReturnKeyTypes.Next)
        entryExt.Unfocus();

    // Call all the methods attached to base_entry event handler Completed
    entryExt.InvokeCompleted();
};

在EntryExt中(直接扩展Entry)

public void InvokeCompleted()
{
    Completed?.Invoke(this, null);
}

但由于错误

,无法调用Completed事件
Error CS0070: The event `Xamarin.Forms.Entry.Completed' can only appear on the left hand side of += or -= when used outside of the type `Xamarin.Forms.Entry'

有没有办法调用Completed事件?我不想在我的观点中为此设置单独的事件处理程序。

2 个答案:

答案 0 :(得分:7)

通过更改修复了问题 entryExt.InvokeCompleted(); 在EditorAction里面 ((IEntryController)元素).SendCompleted(); 它将完成的事件发送回Entry基类。

答案 1 :(得分:3)

我实现了一种类似的实现方法,允许methods: { onSubmit: function (event) { //You can ajax your form data + manually add your location-input from your component } } 按钮扩展为实现任何类型:Go,Next,Done,Send和Search。

示例应用

Here is a Xamarin.Forms app我实施了这种方法。随意下载回购并尝试一下!

1。创建自定义条目

在Xamarin.Forms PCL中,创建自定义条目

Return

2。创建iOS自定义渲染器

在iOS PCL中,创建此自定义渲染器

public class EntryWithCustomKeyboardReturnButton : Entry
{
    public new event EventHandler Completed;

    public static readonly BindableProperty ReturnTypeProperty =
        BindableProperty.Create<EntryWithCustomKeyboardReturnButton, ReturnType>(s => s.ReturnType, ReturnType.Done);

    public ReturnType ReturnType
    {
        get { return (ReturnType)GetValue(ReturnTypeProperty); }
        set { SetValue(ReturnTypeProperty, value); }
    }

    public void InvokeCompleted()
    {
        Completed?.Invoke(this, null);
    }
}

public enum ReturnType
{
    Go,
    Next,
    Done,
    Send,
    Search
}

3。创建Android自定义渲染器

在Android PCL中,创建此自定义渲染器

[assembly: ExportRenderer(typeof(EntryWithCustomKeyboardReturnButton), typeof(EntryWithCustomKeyboardReturnButtonCustomRenderer))]
namespace Sample.iOS
{
    public class EntryWithCustomKeyboardReturnButtonCustomRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            var customEntry = Element as EntryWithCustomKeyboardReturnButton;

            if (Control != null && customEntry != null)
            {
                SetKeyboardButtonType(customEntry.ReturnType);

                Control.ShouldReturn += (UITextField tf) =>
                {
                    customEntry?.InvokeCompleted();
                    return true;
                };
            }
        }

        void SetKeyboardButtonType(ReturnType returnType)
        {
            switch (returnType)
            {
                case ReturnType.Go:
                    Control.ReturnKeyType = UIReturnKeyType.Go;
                    break;
                case ReturnType.Next:
                    Control.ReturnKeyType = UIReturnKeyType.Next;
                    break;
                case ReturnType.Send:
                    Control.ReturnKeyType = UIReturnKeyType.Send;
                    break;
                case ReturnType.Search:
                    Control.ReturnKeyType = UIReturnKeyType.Search;
                    break;
                case ReturnType.Done:
                    Control.ReturnKeyType = UIReturnKeyType.Done;
                    break;
                default:
                    Control.ReturnKeyType = UIReturnKeyType.Default;
                    break;
            }
        }
    }
}

4。在Xamarin.Forms PCL中实现条目的完成事件

以下是link to some sample code,其中显示了如何在Xamarin.Forms PCL中实现[assembly: ExportRenderer(typeof(EntryWithCustomKeyboardReturnButton), typeof(EntryWithCustomKeyboardReturnButtonCustomRenderer))] namespace Sample.Droid { public class EntryWithCustomKeyboardReturnButtonCustomRenderer : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); var customEntry = Element as EntryWithCustomKeyboardReturnButton; if (Control != null && customEntry != null) { SetKeyboardButtonType(customEntry.ReturnType); Control.EditorAction += (object sender, TextView.EditorActionEventArgs args) => { if (customEntry?.ReturnType != ReturnType.Next) customEntry?.Unfocus(); customEntry?.InvokeCompleted(); }; } } void SetKeyboardButtonType(ReturnType returnType) { switch (returnType) { case ReturnType.Go: Control.ImeOptions = ImeAction.Go; Control.SetImeActionLabel("Go", ImeAction.Go); break; case ReturnType.Next: Control.ImeOptions = ImeAction.Next; Control.SetImeActionLabel("Next", ImeAction.Next); break; case ReturnType.Send: Control.ImeOptions = ImeAction.Send; Control.SetImeActionLabel("Send", ImeAction.Send); break; case ReturnType.Search: Control.ImeOptions = ImeAction.Search; Control.SetImeActionLabel("Search", ImeAction.Search); break; default: Control.ImeOptions = ImeAction.Done; Control.SetImeActionLabel("Done", ImeAction.Done); break; } } } }事件。