有没有一种方法可以强制输入大写字母,以及如何将选择器中的项目大写?如果可能的话,不使用插件
答案 0 :(得分:1)
对于Entry,可以在TextChanged事件中将文本更改为大写。
对于Picker,通常可以控制ItemsSource,只需要将ItemsSource中的每个字符串都大写即可。
public MainPage()
{
InitializeComponent();
IList<Item> dummyData= new List<Item>
{
new Item { Id = 0, Name = "Item 0" },
new Item { Id = 1, Name = "Item 1" },
new Item { Id = 2, Name = "Item 2" },
};
picker.ItemsSource = dummyData
.Select(i => i.Name.ToUpperInvariant())
.ToList();
entry.TextChanged += OnTextChanged;
}
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
(sender as Entry).Text = e.NewTextValue.ToUpperInvariant();
}
如果您使用的是MVVM,则可以对Entry.Text和Picker.ItemsSource绑定使用自定义转换器,以将值更改为大写。
答案 1 :(得分:0)
如果您想在Entry
中强制使用UpperCase,有几种方法可以执行此操作,但是这次我们使用Effects
。
如果您还没有听说过效果,可以快速阅读here的效果
首先,您需要在Xamarin.Forms项目中创建效果。
为简单起见,我将其称为EntryAllCapitalEffect
,代码如下所示:
namespace YourAwesomeNamespace
{
public class EntryAllCapitalEffect : RoutingEffect
{
public EntryAllCapitalEffect() : base("StackOverflow.EntryAllCapitalEffect")
{
}
}
}
其中 StackOverflow 是您的公司名称, EntryAllCapitalEffect 是效果名称。
现在,我们需要在每个平台项目中实施效果。
让我们从 Android 开始:
让我们在Android项目中创建一个名为EntryAllCapitalEffect
的文件,并将以下代码添加为实现的一部分。
[assembly: ResolutionGroupName("StackOverflow")] //Remember your companyName ?
[assembly: ExportEffect(typeof(YourAwesomeNamespace.Droid.EntryAllCapitalEffect), "EntryAllCapitalEffect")]
namespace YourAwesomeNamespace.Droid
{
public class EntryAllCapitalEffect : PlatformEffect
{
protected override void OnAttached()
{
try
{
//Let's don't do anything if the control is not a EditText
if (!(Control is EditText editText))
{
return;
}
//Force the keyboard setup all Caps letters
// But the user can still change the Caps taping on Shift
editText.InputType = InputTypes.TextFlagCapCharacters;
// Update any lowercase into Uppercase
var filters = new List<IInputFilter>(editText.GetFilters());
filters.Add(new InputFilterAllCaps());
editText.SetFilters(filters.ToArray());
}
catch (Exception) { }
}
protected override void OnDetached()
{
}
}
}
现在让我们继续 iOS
与Android相同,让我们在iOS项目中创建一个名为EntryAllCapitalEffect
的文件。将下面的代码添加到该类中。
[assembly: ResolutionGroupName("StackOverflow")] // Again your CompanyName
[assembly: ExportEffect(typeof(YourAwesomeNamespace.iOS.EntryAllCapitalEffect), "EntryAllCapitalEffect")]
namespace YourAwesomeNamespace.iOS
{
public class EntryAllCapitalEffect : PlatformEffect
{
protected override void OnAttached()
{
try
{
if (!(Control is UITextField uiTextField))
{
return;
}
//Force the keyboard setup all Caps letters
// But the user can still change the Caps taping on Shift
uiTextField.AutocapitalizationType = UITextAutocapitalizationType.AllCharacters;
//Delegate to replace any Lowercase entry into UpperCase
uiTextField.ShouldChangeCharacters = OnShouldChangeCharacters;
}
catch (Exception) { }
}
protected override void OnDetached()
{
}
private bool OnShouldChangeCharacters(UITextField textfield, NSRange range, string replacementString)
{
using (NSString original = new NSString(textfield.Text), newString = new NSString(replacementString.ToUpper()))
{
textfield.Text = original.Replace(range, newString);
}
return false;
}
}
}
好的,现在就可以使用它,只需将其分配给XAML中的任何Entry
,就像这样:
<Entry HorizontalOptions="FillAndExpand" Placeholder="Enter Text here" >
<Entry.Effects>
<local:EntryAllCapitalEffect />
</Entry.Effects>
</Entry>
记住要在XAML中添加本地别名
xmlns:local="clr-namespace:YourAwesomeNamespace"
这是找到效果的命名空间。
注意:您的 CompanyName 可以是任何东西,但必须与之匹配,并且必须全部使用。
注释2:如果您还有其他Effects
,则无需重复 CompanyName 注册。每个平台只能执行一次。
希望这会有所帮助。-