如何以Xamarin形式大写输入和选择器?

时间:2019-01-09 00:17:07

标签: xamarin xamarin.forms

有没有一种方法可以强制输入大写字母,以及如何将选择器中的项目大写?如果可能的话,不使用插件

2 个答案:

答案 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 注册。每个平台只能执行一次。

希望这会有所帮助。-