【问题标题】:Xamarin Form: Button inside Grid have a margin. How to remove that marginXamarin Form:Grid 内的按钮有边距。如何删除该边距
【发布时间】:2023-03-31 09:50:01
【问题描述】:

我有一个网格包含一组按钮。我已将网格的 columnSpacing 设置为 0,但按钮​​之间仍有边距。我假设它是按钮控件。即使我将按钮上的边距设置为 0,结果也是一样的。

我不能使用 boxView,我需要一个可点击的文本。

【问题讨论】:

    标签: button xamarin grid margin


    【解决方案1】:

    旧线程,但我在我的 Android 平台上得到了这个。将 Xamarin.Forms 从 2.5 升级到最近发布的 3.1 似乎已经解决了这个问题。

    【讨论】:

      【解决方案2】:

      问题是,android 按钮的默认背景可绘制有边距。您可以使用自定义渲染器将其删除。 Xamarin.Forms custom renderer

      例子:

      using System;
      using test.Droid;
      using Xamarin.Forms;
      using Xamarin.Forms.Platform.Android;
      
      [assembly: ExportRenderer(typeof(Button), typeof(DefaultButtonRenderer))]
      namespace test.Droid
      {
          public class DefaultButtonRenderer: ButtonRenderer
          {
              protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
              {
                  base.OnElementChanged(e);
      
                  // Control is Android.Widget.Button, Element is Xamarin.Forms.Button
                  if (Control != null && Element != null)
                  {
                      // remove default background image
                      Control.Background = null;
      
                      // set background color
                      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());
                  }
              }
          }
      }
      

      此代码将删除按钮单击效果。如果要保持效果,则必须将 Control.Background 设置为适当的资源。 (例如:Android.Resource.Attribute.SelectableItemBackground)

      或者,您可以使用带有TapGestureRecognizer 的标签。您可以将 TapGestureRecognizer 添加到任何视图。

      【讨论】: