Button 如何在Xamarin表单XAML中删除按钮的边距?

Button 如何在Xamarin表单XAML中删除按钮的边距?,button,xamarin,xamarin.android,xamarin.forms,margin,Button,Xamarin,Xamarin.android,Xamarin.forms,Margin,我是Xamarin的新手,所以请耐心点! 不知怎的,Xamarin在我所有的按钮上添加了一个神秘的边距,我不知道如何去掉它 这是我的密码: 这是一张图片: 您可以清楚地看到按钮周围的空间。它来自哪里?更重要的是:如何删除它?问题是默认按钮背景包含此边距。您必须手动将BackgroundColor设置为颜色,并将BorderWidth和BorderRadius设置为零 只是为了补充斯文·迈克尔·斯图贝的作品 如果没有按钮需要边距,则在PCL中创建一个或一个自定义控件(例如:Margin

我是Xamarin的新手,所以请耐心点! 不知怎的,Xamarin在我所有的按钮上添加了一个神秘的边距,我不知道如何去掉它

这是我的密码:


这是一张图片:


您可以清楚地看到按钮周围的空间。它来自哪里?更重要的是:如何删除它?

问题是默认按钮背景包含此边距。您必须手动将
BackgroundColor
设置为颜色,并将
BorderWidth
BorderRadius
设置为零



只是为了补充斯文·迈克尔·斯图贝的作品


如果没有按钮需要边距,则在PCL中创建一个或一个自定义控件(例如:MarginLessButton)

您可能已经修复了该问题:

我解决这个问题的方法是在android上创建一个渲染器来覆盖xamarin上的按钮

public class FixedMarginRenderer : ButtonRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            // remove default background image
            Control.Background = null;
            Control.SetBackgroundColor(Element.BackgroundColor.ToAndroid()); 
        }
    }

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

        if (e.PropertyName == "BackgroundColor")
        {
            // You have to set background color here again, because the background color can be changed later.
            Control.SetBackgroundColor(Element.BackgroundColor.ToAndroid());
        }
    }
} 
公共类FixedMarginRenderer:ButtonRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
//删除默认背景图像
Control.Background=null;
Control.SetBackgroundColor(Element.BackgroundColor.ToAndroid());
}
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
如果(例如,PropertyName==“BackgroundColor”)
{
//您必须在此处再次设置背景色,因为背景色可以稍后更改。
Control.SetBackgroundColor(Element.BackgroundColor.ToAndroid());
}
}
} 

手动设置
背景色
边框宽度
边框半径
不再有效。但是您可以使用平台配置来删除填充。这也是必要的,以消除阴影,否则将有一些垂直边缘

试着这样做:

using Xamarin.Forms;
using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;

namespace MyControls
{
    public class ButtonNoMargin : Xamarin.Forms.Button
    {
        public ButtonNoMargin() : base()
        {
           this.On<Android>().SetUseDefaultPadding(false);
           this.On<Android>().SetUseDefaultShadow(false);
        }
    }
}
使用Xamarin.Forms;
使用Xamarin.Forms.PlatformConfiguration;
使用Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
命名空间MyControls
{
公共类ButtonNoMargin:Xamarin.Forms.Button
{
public ButtonNoMargin():base()
{

这个。在

上非常感谢您的快速回答!不幸的是,这对我不起作用,按钮仍然有相同的边距。可能是因为,还有其他地方(全球)设置或需要更改的内容?此外:这样做是不是很奇怪?我的意思是,谁应该知道?这是非常不合逻辑的。如果我也想有一个Borderradius/witdh呢?一切都是最新的(Xamarin.Forms)?你清理并重建了吗?正如你在屏幕截图上看到的,它肯定在工作(Android 6.0).您正在使用AppCompat吗?似乎AppCompat可能会停止此解决方案的工作。如果是这样,则此答案与在所选答案中实现2个类相结合对我有效。我还使用了Control?.SetPadding(0,0,0,0);在OnElementChanged方法中。否则,对于固定宽度和高度的按钮,默认填充可能会干扰按钮内文本的布局。-From
using Xamarin.Forms;
using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;

namespace MyControls
{
    public class ButtonNoMargin : Xamarin.Forms.Button
    {
        public ButtonNoMargin() : base()
        {
           this.On<Android>().SetUseDefaultPadding(false);
           this.On<Android>().SetUseDefaultShadow(false);
        }
    }
}