Xamarin表单 - 包装按钮文本

时间:2016-12-30 19:59:56

标签: forms xamarin xamarin.ios xamarin.android xamarin.forms

上下文:

我正在尝试制作一个由按钮网格组成的应用。其中一些文本的大小超过了自己的宽度

问题:

问题是XF Button正在“包装”文本,用省略号替换中间的一些字符(...):

[Button text]1]

我希望将文本包装成多行,如标签中的文字:

enter image description here

上网时我发现了一些方法:

  • 在RelativeLayout中使用Button和Label。 Label与Button重叠并将InputTransparent属性设置为true,您可以实现类似Button的控件。

  • 在布局中使用标签并处理点击手势

  • 使用特定于平台的代码使用CustomRenderer呈现本机按钮(我不希望平台特定的代码显示按钮)

这些方法的问题是结果看起来不像原生按钮,或者表现得不像原生按钮。

有一种方法可以同时提供这两种方法吗?一个外观和行为类似于原生按钮的控件。

1 个答案:

答案 0 :(得分:7)

  

使用特定于平台的代码使用CustomRenderer呈现本机按钮(我不希望使用特定于平台的代码来显示按钮)

这是IMO的最佳解决方案。它将为您提供原生按钮的外观和感觉。

由于Forms按钮不公开自动换行属性,因此您必须使用本机控件的属性来执行此操作。以下是iOS上自定义渲染器的非常简单的代码,用于启用自动换行:

using System;
using NameSpaceForMyiOSApp;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonRenderer))]
namespace NameSpaceForMyiOSApp
{
    public class MyButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
                Control.TitleLabel.LineBreakMode = UIKit.UILineBreakMode.WordWrap;
        }
    }
}

在Android上,默认情况下文本会自动换行,因此不需要自定义渲染器,但请注意,如果单个单词要长到适合按钮的宽度,则单词本身将被拆分。我能想到的唯一解决方案是确保按钮宽度足够宽以容纳按钮文本中最长的单词。有关详细信息,请参阅此SO答案:Wrap text in button gracefully at whitespace