首页 > 解决方案 > 如何在 xamarin 表单中大写输入和选择器?

问题描述

有没有办法强制输入大写以及如何将选择器内的项目大写?如果可能不使用插件

标签: xamarinxamarin.forms

解决方案


如果你想强制使用大写,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;
        }
    }
}

好的,现在使用它只需将其分配给EntryXAML 中的任何内容,如下所示:

<Entry HorizontalOptions="FillAndExpand" Placeholder="Enter Text here" >
    <Entry.Effects>
        <local:EntryAllCapitalEffect />
    </Entry.Effects>                
</Entry>

记得在 XAML 中添加本地别名

xmlns:local="clr-namespace:YourAwesomeNamespace"

这将是您的 Effect 所在的命名空间。

注意:您的CompanyName可以是任何内容,但必须匹配所有放置此使用的名称。

注意2:如果您有其他Effects的,您不需要重复公司名称注册。这仅由平台完成一次。

希望这可以帮助。-


推荐阅读