Xamarin 从条目中删除填充

Xamarin 从条目中删除填充,xamarin,xamarin.forms,Xamarin,Xamarin.forms,所以条目没有padding属性,但是条目上有一些明确的padding 范例 我将“Michigan”条目与下面的“Select”标签对齐,但是它们看起来没有对齐,因为条目左侧有一些填充。我尝试了条目确实具有的边距属性,但是它不起作用 我该如何消除这种差距/填充 我想补充一点,添加偏移边距不起作用。您需要为条目创建自定义渲染器,并使用SetPadding方法将Android EditText的PaddingLeft设置为0 摘自Android上的CustomEntryRenderer: prot

所以条目没有padding属性,但是条目上有一些明确的padding

范例

我将“Michigan”条目与下面的“Select”标签对齐,但是它们看起来没有对齐,因为条目左侧有一些填充。我尝试了条目确实具有的边距属性,但是它不起作用

我该如何消除这种差距/填充


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

您需要为条目创建自定义渲染器,并使用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);
}
protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.NewElement==null)返回;
Control.SetPadding(0,Control.PaddingTop,Control.PaddingRight,Control.PaddingBottom);
}

对我来说,可以使用的自定义渲染是:

[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;
                }
            }
        }
    }
}
[程序集:Xamarin.Forms.ExportRenderer(typeof(MyApp.Views.Controls.CustomEntry)、typeof(MyApp.Droid.Views.Controls.CustomRenderer.Android.CustomEntryRenderer))]
命名空间MyApp.Droid.Views.Controls
{
名称空间CustomRenderer.Android
{
公共类CustomEntryRenderer:EntryRenderer
{
公共CustomEntryRenderer(上下文):基本(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
Control.Background=新的可着色(Color.Transparent);
控件。设置填充(0,0,0,0);
Control.Gravity=GravityFlags.CenterVertical | GravityFlags.Left;
Control.TextAlignment=TextAlignment.Gravity;
}
}
}
}
}

我也遇到了同样的问题,但我通过创建一个自定义条目类型解决了这个问题,该类型为Xamarin表单的条目添加了一个Padding属性:

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); }
    }
}
然后我使用自定义渲染器渲染这个CustomEntry,就像Danilow建议的那样,唯一的区别是我从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);
            }
        }
    }
}
[程序集:ExportRenderer(typeof(Entry)、typeof(CustomEntryRenderer))]
命名空间CrossPlatformLibrary.Forms.Android.renders
{
公共类CustomEntryRenderer:EntryRenderer
{
公共CustomEntryRenderer(上下文):基本(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.NewElement==null)
{
返回;
}
if(this.Element为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更改做出反应,则需要扩展此代码,并且如果您也想在IOS上支持PaddingProperty,则需要为IOS编写自定义渲染器。

对于任何需要它的人,在IOS上也实现了同样的功能。基本上是将左视图的宽度设置为0,但也可以使用“LeftViewMode”将其完全隐藏

 this.Control.LeftView = new UIView(new CGRect(0, 0, 0, this.Control.Frame.Height));
完整代码

using CoreGraphics;
using UIKit;
using YourNamespace.iOS.CustomRenderers;
using YourNamespace.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(BorderlessEntry), typeof(BorderlessEntryRenderer))]
namespace YourNamespace.iOS.CustomRenderers
{

    public class BorderlessEntryRenderer : Xamarin.Forms.Platform.iOS.EntryRenderer
    {

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

            base.OnElementChanged(e);
            if (this.Control != null)
            {

                this.Control.LeftView = new UIView(new CGRect(0, 0, 0, this.Control.Frame.Height));
                this.Control.LeftViewMode = UITextFieldViewMode.Always;

            }

        }
    }
}
使用CoreGraphics;
使用UIKit;
使用YourNamespace.iOS.CustomRenders;
使用YourNamespace.Controls;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
[程序集:ExportRenderer(typeof(borderlesstry)、typeof(borderlesstryrender))]
命名空间YourNamespace.iOS.CustomRenders
{
公共类BorderReducerRenderer:Xamarin.Forms.Platform.iOS.EntryRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(this.Control!=null)
{
this.Control.LeftView=newUIView(newCGRECT(0,0,0,this.Control.Frame.Height));
this.Control.LeftViewMode=UITextFieldViewMode.Always;
}
}
}
}

看看这个线程,代码应该放在什么文件中的什么地方?一个干净优雅的方法,只改变左边的填充,谢谢@Christian这是Android项目中的CustomEntryRenderer文件,在谷歌上你会发现很多例子:)