【发布时间】:2018-02-06 18:40:40
【问题描述】:
我有一个用户名标签,需要将其视为大写,但这应该只与 UI 相关。数据(字符串)应作为实际情况保存在数据库中,无论它是什么。谁能告诉我是否有办法将其转换为大写而不通过后面的代码这样做?
【问题讨论】:
标签: c# xaml xamarin.forms xamarin.ios label
我有一个用户名标签,需要将其视为大写,但这应该只与 UI 相关。数据(字符串)应作为实际情况保存在数据库中,无论它是什么。谁能告诉我是否有办法将其转换为大写而不通过后面的代码这样做?
【问题讨论】:
标签: c# xaml xamarin.forms xamarin.ios label
您可以将Label.TextTransform 与TextTransform.Uppercase 一起使用。
XAML
<Label TextTransform="Uppercase" />
C#
var label = new Label
{
TextTransform = TextTransform.Uppercase
};
【讨论】:
如您所知,您可以从后面的代码中执行此操作:
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}}"
【讨论】:
或者你可以使用 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);
}
}
【讨论】: