从条目中删除填充

时间:2016-11-23 20:24:56

标签: xamarin xamarin.forms

因此Entry没有填充属性,但条目上有一些明确的填充。

实施例

enter image description here

我将“密歇根”条目与下面的“选择”标签对齐,但是它们看起来不对齐,因为条目左边有一些填充。我尝试了条目确实具有的margin属性,但它没有用。

如何摆脱差距/填充?

我想补充一点,添加偏移边距不起作用。

4 个答案:

答案 0 :(得分:5)

您需要为条目创建自定义渲染器,并使用SetPadding方法将Android EditText的PaddingLeft设置为0。

摘自Android上的CustomEntryRenderer:

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
    base.OnElementChanged(e);
    if (e.NewElement == null) return;
    Control.SetPadding(0, Control.PaddingTop, Control.PaddingRight, Control.PaddingBottom);
}

答案 1 :(得分:0)

对我来说,有效的自定义渲染为:

[assembly: Xamarin.Forms.ExportRenderer(typeof(MyApp.Views.Controls.CustomEntry), typeof(MyApp.Droid.Views.Controls.CustomRenderer.Android.CustomEntryRenderer))]
namespace MyApp.Droid.Views.Controls
{
 namespace CustomRenderer.Android
    {
        public class CustomEntryRenderer : EntryRenderer
        {
            public CustomEntryRenderer(Context context) : base(context)
            {
            }

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

                if (Control != null)
                {
                    Control.Background = new ColorDrawable(Color.Transparent);
                    Control.SetPadding(0, 0, 0, 0);
                    Control.Gravity = GravityFlags.CenterVertical | GravityFlags.Left;
                    Control.TextAlignment = TextAlignment.Gravity;
                }
            }
        }
    }
}

答案 2 :(得分:0)

我在同样的问题上苦苦挣扎,但是我通过创建一个自定义Entry类型解决了这个问题,该类型将Padding属性添加到Xamarin Forms的Entry中:

public class CustomEntry : Entry
{
    public static readonly BindableProperty PaddingProperty =
        BindableProperty.Create(
            nameof(Padding),
            typeof(Thickness),
            typeof(CustomEntry),
            new Thickness());

    public Thickness Padding
    {
        get { return (Thickness)this.GetValue(PaddingProperty); }
        set { this.SetValue(PaddingProperty, value); }
    }
}

然后,我像Danilow所建议的那样,使用自定义渲染器渲染CustomEntry,唯一的区别是,我从CustomEntry中读取了PaddingProperty并将其应用于CustomEntryRenderer中。

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer))]

namespace CrossPlatformLibrary.Forms.Android.Renderers
{
    public class CustomEntryRenderer : EntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context)
        {
        }

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

            if (e.NewElement == null)
            {
                return;
            }

            if (this.Element is CustomEntry customEntry)
            {
                var paddingLeft = (int)customEntry.Padding.Left;
                var paddingTop = (int)customEntry.Padding.Top;
                var paddingRight = (int)customEntry.Padding.Right;
                var paddingBottom = (int)customEntry.Padding.Bottom;
                this.Control.SetPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
            }
        }
    }
}

当心::如果您想对PaddingProperty的更改做出反应,则需要扩展此代码-并且-如果您也要支持Padding属性,则需要为IOS编写自定义渲染器。

答案 3 :(得分:0)

对于需要iOS的人来说,这也是在iOS上实现的。基本上是将左视图的宽度设置为0,但是您也可以使用“ LeftViewMode”将其完全隐藏。

tbody

完整代码

switch