如何在Xamarin表单中更改密码屏蔽字符 - 条目

时间:2017-07-06 07:44:38

标签: xamarin xamarin.android xamarin.forms

我目前面临一个相当简单的问题,最终让我走到了尽头。我正在构建一个使用Xamarin Forms的应用程序,并希望在用户从子弹输入密码到星号时更改屏蔽字符。

输入密码我在我的内容页面中使用便携式lib项目中的Entry控件(在VS2017专业人员中):

<Entry x:Name="Entry_Password" Placeholder="Password" IsPassword="True" />

我知道我可能应该在Android项目中为此创建一个自定义渲染器,但我真的很感激如何为此特定目的而做。

2 个答案:

答案 0 :(得分:2)

我确定转换器的答案是可行的,但作为个人喜好,我不喜欢它。这看起来像是我的渲染工作。

以下是我将如何做到这一点(仅在android中有例子,因为我没有ios,但在那里实现它相当简单)

用法Xamarin表格

        <controls:PasswordBox Placeholder="Password"/>

渲染器(Android)

[assembly: ExportRenderer(typeof(PasswordBox), typeof(PasswordBoxRenderer))]
namespace PasswordAsterisk.Droid.Renderers
{
public class PasswordBoxRenderer : EntryRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            Control.InputType = Android.Text.InputTypes.TextVariationPassword |
                      Android.Text.InputTypes.ClassText;

            Control.TransformationMethod = new HiddenPasswordTransformationMethod();
        }
    }
}
internal class HiddenPasswordTransformationMethod : Android.Text.Method.PasswordTransformationMethod
{
    public override Java.Lang.ICharSequence GetTransformationFormatted(Java.Lang.ICharSequence source, Android.Views.View view)
    {
        return new PasswordCharSequence(source);
    }
}

internal class PasswordCharSequence : Java.Lang.Object, Java.Lang.ICharSequence
{
    private Java.Lang.ICharSequence _source;
    public PasswordCharSequence(Java.Lang.ICharSequence source)
    {
        _source = source;
    }

    public char CharAt(int index)
    {
        return '*';
    }

    public int Length()
    {
        return _source.Length();
    }

    public Java.Lang.ICharSequence SubSequenceFormatted(int start, int end)
    {
        return _source.SubSequenceFormatted(start, end); 
    }

    public IEnumerator<char> GetEnumerator()
    {
        return _source.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return _source.GetEnumerator();
    }
}
}

GitHub

中的完整源代码示例

答案 1 :(得分:1)

更简单的方法是使用转换器来交换星号中的每个字母,而不是当您请求值时它是明白的。

这是一篇有趣的帖子,可以帮助您解决问题:https://forums.xamarin.com/discussion/52354/is-there-a-way-to-partially-mask-an-entry-field-in-xamarin

它的导入是单向使用而不是双向使用!

祝你好运