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