【问题标题】:Display label text in uppercase using xaml in Xamarin.Forms在 Xamarin.Forms 中使用 xaml 以大写形式显示标签文本
【发布时间】:2018-02-06 18:40:40
【问题描述】:

我有一个用户名标签,需要将其视为大写,但这应该只与 UI 相关。数据(字符串)应作为实际情况保存在数据库中,无论它是什么。谁能告诉我是否有办法将其转换为大写而不通过后面的代码这样做?

【问题讨论】:

    标签: c# xaml xamarin.forms xamarin.ios label


    【解决方案1】:

    您可以将Label.TextTransformTextTransform.Uppercase 一起使用。

    XAML

    <Label TextTransform="Uppercase" />
    

    C#

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

    【讨论】:

      【解决方案2】:

      如您所知,您可以从后面的代码中执行此操作:

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

      因此请记住,您不想这样做,您需要从 UILabel 派生并创建自己的,然后只需将 ToUpper() 添加到 get;set; 的末尾即可。 Text 属性的值。

      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(); }    
         }
      }
      

      编辑:根据下面的 cmets,这是 Xamarin.Forms 的替代解决方案

      这使用值转换器作为绑定解决方案的一部分。在下面的 cmets 中使用 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 您只是将字符串转换为大写,您不必在其他任何地方重用该字符串,无论哪种方式,我都已将上面的答案更新为标签的文本属性,而不是在您分配的字符串上使用 ToUpper()。
      • 如何将其绑定到内容视图 xaml 中的标签?
      • 成功了,感谢您的回复。@stackoverflow.com/users/4486115/digitalsa1nt
      • 我为你的好转换器做了一个小周。仅检查上/下参数的第一个字符可以为开发人员如何使用它提供更多的错误补偿。他们可以发送“U”或“UPPER”作为参数,它仍然有效,增加 XAML 可读性` switch (param.ToUpper()[0]) { case 'U': return ((string)value).ToUpper() ; case 'L': return ((string)value).ToLower();默认值:返回((字符串)值); `
      【解决方案3】:

      或者你可以使用 Bindable 属性然后格式化 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);
              }
          }
      

      【讨论】:

      • 使属性特定于显示需求是反 MVVM 的。相同的属性可能会用于其他 10 个不需要大写的视图。数据应保持纯净。 UI 层有责任在特定视图上以特定方式呈现它。
      • @ClintStLaurent 可绑定属性的目的是为 UI 保存一个值。因此,它用于根据 UI 显示要求设置样式或格式化数据。
      • 我不同意有几个原因。首先...如果您想在 200 个模型中执行此操作,则必须在每个模型中都具有此额外属性。想都别想。如果您使用转换器,您只需定义一次,然后在 XAML 中使用 200 次。
      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多