编辑/输入下的自定义布局

时间:2018-01-22 07:37:07

标签: button xamarin.forms grid focus editor

我在Xamarin.Forms中有一个条目/编辑器,我想在它下面出现一个布局,只要它是聚焦的。

布局由一个包含多个按钮的网格组成。

我在编辑器中的编辑器下添加了网格,并根据编辑器的IsFocused属性切换其可见性。 遗憾的是,当我按下其中一个网格按钮时,编辑器失去焦点,因此布局将无法实现。

修改 另一个非常重要的一点是,网格可以与其他控件重叠,目前正在发生这种情况,因为我将编辑器和网格作为最后一个子节点添加到另一个网格中。 我可能还需要解决这个问题,也许只是将这个Grid放到android相对布局中并将此布局添加到本机EditText中?

我想让它在点击其中一个按钮后仍然可见。我该如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

我会为每个平台编写EditorRenderer并添加所有按钮,它应该修复Focus问题(因为你永远不会失去焦点:))

实施例:

using System;
using Xamarin.Forms;

namespace Common
{
    public class CustomEditor : Editor
    {
        public Action<string> ButtonXCallback { get; set; }
    }
}

IOS:

using Common.iOS;
using Common;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;


[assembly: ExportRenderer(typeof (CustomEditor), typeof (CustomEditorRenderer))]
namespace Common.iOS
{
    public class CustomEditorRenderer : EditorRenderer
    {
        private UIButton ButtonX { get; set; }

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

            var element = Element as CustomEditor;

            if (Control != null && element != null)
            {
                if (ButtonX == null)
                {
                    ButtonX = new UIButton();
                    ButtonX.SetImage(UIImage.FromBundle("ico_x.png"), UIControlState.Normal);

                    ButtonX.TouchUpInside += (sender, f) => {
                        var text = Control.Text;

                        if (element.ButtonXCallback != null)
                            element.ButtonXCallback.Invoke(text);
                    };

                    Control.AddSubview(ButtonX);
                }
            }
        }
    }
}

德罗伊德:

using System;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Graphics.Drawables.Shapes;
using Common.Droid;
using Common;
using Android.Text;
using Android.Widget;
using Android.Runtime;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Views;

[assembly: ExportRenderer(typeof (CustomEditor), typeof (CustomEditorRenderer))]
namespace Common.Droid
{
    public class CustomEditorRenderer : EditorRenderer
    {
        private ImageButton ButtonX { get; set; }

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

            if (Control == null)
                return;

            if (Element == null)
                return;

            var element = (CustomEditor) Element;
            if (element == null)
                return;

            if (ButtonX == null)
            {
                ButtonX = new ImageButton(Context);
                ButtonX.SetImageResource(Resource.Drawable.ico_x);
                ButtonX.SetBackgroundColor(Android.Graphics.Color.Transparent);
                ButtonX.Click += (sender, f) =>
                {
                    var text = Control.Text;

                    if (element.ButtonXCallback != null)
                        element.ButtonXCallback.Invoke(text);
                };

                AddView(ButtonX);
            }
        }
    }
}