在Xamarin.Forms中使用XAML将标签文本显示为大写

11

我有一个用户名标签,需要将其显示为大写字母,但这仅适用于用户界面。无论输入的数据(字符串)是什么,都应该按照实际大小写保存在数据库中。请问是否有任何方法可以在不通过代码后台进行转换的情况下将其转换为大写字母?

3个回答

30

您可以使用 Label.TextTransformTextTransform.Uppercase

XAML

<Label TextTransform="Uppercase" />

C#

var label = new Label
{
    TextTransform = TextTransform.Uppercase
};

11

正如你所知,你可以在代码后台这样做:

string data = "my data";
UILabel myLabel = new UILabel();
myLabel.Text = data.ToUpper();

考虑到你不想这样做,你需要从UILabel派生出自己的类,并在Text属性的get;set;值的末尾简单地添加ToUpper()。

using CoreGraphics;
using System;
using UIKit;

namespace MyApp.Controls
{
    partial class Control_UpperLabel : UILabel
    {
        public Control_UpperLabel IntPtr handle) : base(handle)
        {
               //
        }

        public Control_UpperLabel()
        {
               //
        }

        public override void Draw(CGRect rect)
        {
            base.Draw(rect);
        }

        public override string Text { get => base.Text.ToUpper(); set => base.Text = value.ToUpper(); }    
   }
}

编辑:根据下面的评论,这是适用于Xamarin.Forms的另一种解决方案

这使用一个值转换器作为绑定解决方案的一部分。它还稍微修改以使用下面评论中clint的建议。谢谢。

public class StringCaseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch ((parameter as string).ToUpper()[0]) 
        { 
        case 'U': 
            return ((string)value).ToUpper(); 
        case 'L': 
            return ((string)value).ToLower(); 
        default: 
            return ((string)value);
        };
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

它将在XAML中使用如下:

Text="{Binding Text, Converter={StaticResource caseConverter}, ConverterParameter=u}}"

我不想将标签文本转换为大写,只需要以大写形式显示。有没有办法仅在前端显示大写而不在后端代码中进行转换? - Riyas
如何将此绑定到内容视图 XAML 中的标签? - Riyas
你是在使用Xamarin Forms吗?还是使用Xamarin原生iOS? - JoeTomks
1
它起作用了,感谢您的回复。@https://stackoverflow.com/users/4486115/digitalsa1nt - Riyas
1
我对你的好转换器进行了微小的调整。仅检查大小写参数的第一个字符可以为开发人员使用它提供更多的错误补偿。他们可以发送“U”或“UPPER”作为参数,它仍然可以工作,增加XAML的可读性。switch (param.ToUpper()[0]) { case 'U': return ((string)value).ToUpper(); case 'L': return ((string)value).ToLower(); default: return ((string)value); } - Clint StLaurent
显示剩余5条评论

0

或者您可以使用可绑定属性,然后在getter上格式化文本: 例如:

  public static readonly BindableProperty ItemLabelProperty = 
  BindableProperty.Create(nameof(ItemLabel), typeof(string), 
  typeof(DetailsLineItemControl), default(string), BindingMode.OneWay);
    public string ItemLabel
    {
        get
        {

            var value = (string)GetValue(ItemLabelProperty);
            return !string.IsNullOrEmpty(value) ? value.ToUpper() : value;
        }
        set
        {
            SetValue(ItemLabelProperty, value);
        }
    }

1
将属性与特定显示需求绑定是反MVVM的。同一属性可能在其他10个视图上使用,这些视图不需要大写字母。数据应该保持纯净。将其以特定方式呈现在特定视图上是UI层的责任。 - Clint StLaurent
@ClintStLaurent 可绑定属性的目的是为 UI 保存一个值。因此,它用于根据 UI 显示要求对数据进行样式或格式化。 - mulodzwi
我有几个理由不同意。 首先... 如果你想在200个模型中这样做,你必须在每一个模型中都加上这个额外的属性。绝对行不通。 而如果你使用转换器,你只需要定义一次并从XAML中使用200次即可。 - Clint StLaurent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接