我目前面临一个相当简单的问题,最终让我走到了尽头。我正在构建一个使用Xamarin Forms的应用程序,并希望在用户从子弹输入密码到星号时更改屏蔽字符。
输入密码我在我的内容页面中使用便携式lib项目中的Entry控件(在VS2017专业人员中):
<Entry x:Name="Entry_Password" Placeholder="Password" IsPassword="True" />
我知道我可能应该在Android项目中为此创建一个自定义渲染器,但我真的很感激如何为此特定目的而做。
答案 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();
}
}
}
中的完整源代码示例
答案 1 :(得分:1)
更简单的方法是使用转换器来交换星号中的每个字母,而不是当您请求值时它是明白的。
这是一篇有趣的帖子,可以帮助您解决问题:https://forums.xamarin.com/discussion/52354/is-there-a-way-to-partially-mask-an-entry-field-in-xamarin
它的导入是单向使用而不是双向使用!
祝你好运