【问题标题】:Xamarin.Forms: Remove padding inside ButtonXamarin.Forms:删除按钮内的填充
【发布时间】:2016-07-10 22:45:57
【问题描述】:

我想要一个小按钮。按钮的高度为 30。在某些平台(Android、UWP)上,按钮内的文本被截断。那是因为文本和外边框之间有一个填充。

一种选择是使按钮更大,但文本有足够的空间。是否有设置内部填充的选项?

【问题讨论】:

    标签: button xamarin padding xamarin.forms


    【解决方案1】:

    现在 Xamarin 允许您在 XAML 中执行类似的操作:

     <Button.Padding>
         <Thickness>0</Thickness>
     </Button.Padding>
    

    或者在 C# 中:

    Button button = new Button();
    button.Text = "Button";
    button.Clicked += OnClicked;
    button.Padding = new Thickness(0, 0, 0, 0);
    

    【讨论】:

      【解决方案2】:

      在 Android 上,您可以通过样式来做到这一点。

      资源/values-v21/styles.xml

      <?xml version="1.0" encoding="utf-8" ?>
      <resources>
        <style name="myTheme" parent="android:Theme.Material">
          <item name="android:buttonStyle">@style/noPaddingButtonStyle</item>
        </style>
      
        <style name="noPaddingButtonStyle" parent="android:Widget.Material.Button">
          <item name="android:paddingLeft">0dp</item>
          <item name="android:paddingRight">0dp</item>
        </style>
      </resources>
      

      AndroidManifest.xml

      将自定义主题设置为应用程序主题。

      <application android:label="$safeprojectname$" android:theme="@style/myTheme"></application>
      

      将左右边距设置为0dp。默认样式有填充。

      这适用于 Android >= 5。如果您想支持较低的 android 版本,则必须添加多个样式文件夹并使用其他基本主题,例如 Theme.HoloTheme.AppCompat


      或者你去渲染器:

      using App6.Droid;
      using Xamarin.Forms;
      using Xamarin.Forms.Platform.Android;
      
      [assembly: ExportRenderer(typeof(Button), typeof(ZeroPaddingRenderer))]
      namespace App6.Droid
      {
          public class ZeroPaddingRenderer : ButtonRenderer
          {
              protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
              {
                  base.OnElementChanged(e);
      
                  Control?.SetPadding(0, Control.PaddingTop, 0, Control.PaddingBottom);
              }
          }
      }
      

      【讨论】:

      【解决方案3】:

      一种选择是使用 Label 而不是 Button,并使用 TapGestureRecognizer 而不是 Click 事件。与 Button 相比,Label 为您提供了对文本布局的更多控制,但您无法获得将其转换为每个平台上的本机按钮控件的优势。

      【讨论】:

      • 我经常这样做。但我注意到与按钮相比,Android 的性能受到了影响。 1)您必须准确地点击文本(有时很薄)和 2)附加的命令不会像使用按钮那样快速触发。
      • TapGestureRecognizers 也会与 ScrollViews 冲突。
      • @François 有没有办法克服对文本的精确点击?
      • 你可以作弊并在标签顶部添加一个透明的boxview,并在盒子上添加点击手势。然而,按钮提供了更多关于命令的行为,而只是识别点击,所以我尝试尽可能多地使用它们。
      • @François WOW tx 供您快速回复。有没有办法用GestureRecognizers 实现ButtonPressedReleased 事件?我需要有关点击/单击/鼠标按下持续时间的信息。
      【解决方案4】:

      也许您可以使用FontSize 来适应按钮HeightRequest,除非您需要创建自定义渲染器来设置填充。

      【讨论】:

      • 所以没有选择。我可以为每个平台使用不同的FontSize,但如果我想让它完美,我需要自定义渲染器。