xamarin - 如何在 xamarin 表单中大写输入和选择器?
问题描述
有没有办法强制输入大写以及如何将选择器内的项目大写?如果可能不使用插件
解决方案
如果你想强制使用大写,Entry
有几种方法可以做到这一点,但让我们使用Effects
这个时间。
如果您还没有听说过 Effects,您可以在这里快速阅读它们的用途
首先,您需要在 Xamarin.Forms 项目中创建效果。
为简单起见,我将其命名为EntryAllCapitalEffect
,代码如下所示:
namespace YourAwesomeNamespace
{
public class EntryAllCapitalEffect : RoutingEffect
{
public EntryAllCapitalEffect() : base("StackOverflow.EntryAllCapitalEffect")
{
}
}
}
StackOverflow是您的公司名称,EntryAllCapitalEffect是效果名称。
现在我们需要在每个平台项目中实现效果。
让我们从安卓开始:
让我们使用名称在 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;
}
}
}
好的,现在使用它只需将其分配给Entry
XAML 中的任何内容,如下所示:
<Entry HorizontalOptions="FillAndExpand" Placeholder="Enter Text here" >
<Entry.Effects>
<local:EntryAllCapitalEffect />
</Entry.Effects>
</Entry>
记得在 XAML 中添加本地别名
xmlns:local="clr-namespace:YourAwesomeNamespace"
这将是您的 Effect 所在的命名空间。
注意:您的CompanyName可以是任何内容,但必须匹配所有放置此使用的名称。
注意2:如果您有其他Effects
的,您不需要重复公司名称注册。这仅由平台完成一次。
希望这可以帮助。-
推荐阅读
- server - 如何镜像托管 500 个网站的服务器
- azure - Terraform azurerm azurerm_data_factory_dataset_binary 参数定义
- python - 在 Django 中使用用户模型创建关系数据库。我想我已经创建了关系数据库,但我不知道出了什么问题
- tensorflow - 具有图像增强数据集的 CNN 模型
- swift - 为模拟器构建应用程序时排除 *.a 文件
- java - 如何在 DragListener 中获取画布项目以便在其中绘制?
- python - 使用经过训练的模型进行预测时,如何测量每个节点的激活水平?
- ios - 蒸汽 4 认证
- python - 如何跳过一列并将其余列相乘?
- python - 如何替换文本文件中的字符串并将其保存到新文件中?