【发布时间】:2021-02-11 15:58:53
【问题描述】:
在我的 Xamarin 应用程序中,在 PIN 页面上,有 8 个输入字段,4 个用于 PIN,4 个用于确认 PIN(这里我只粘贴 2 个)。
当用户在一个字段中输入一个值时,光标会聚焦在下一个字段上,依此类推。但是如果他们错误地输入了值并想要清除它,他们就无法通过按Backspace 按钮返回到最后一个条目。他们必须按下该输入字段才能获得焦点。
以下是输入字段的代码。如何通过按 Backspace 按钮返回/关注最后一个输入字段?
.xml
<Entry
x:Name="PasswordOne"
Text="{Binding PasswordOne}"
IsPassword="True"
Keyboard="Numeric"
MaxLength="1"
ReturnType="Next"
TextChanged="Entry_FieldChanged" />
.xml.cs
public PasswordPage()
{
InitializeComponent();
entryList = new List<Entry>();
entryList.Add(PasswordOne);
entryList.Add(PasswordTwo);
entryList.Add(ConfirmPasswordOne);
entryList.Add(ConfirmPasswordTwo);
}
private void Entry_FieldChanged(object sender, TextChangedEventArgs e)
{
var entry = sender as Entry;
const string numregex = "^[0-9]+$";
if (!(!System.Text.RegularExpressions.Regex.IsMatch(entry.Text, numregex) || entry.Text == ""))
{
if (entry.Text.Length >= 1)
{
var index = entryList.IndexOf(entry);
var nextIndex = (index + 1) >= entryList.Count ? 0 : index + 1;
var next = entryList.ElementAt(nextIndex);
if (entry == ConfirmPasswordTwo)
{ }
else
{
next?.Focus();
}
}
}
else
{
var index = entryList.IndexOf(entry);
var prevIndex = (index) == 0 ? 0 : index - 1;
var prev = entryList.ElementAt(prevIndex);
if (entry == PasswordOne)
{ }
else
{
prev?.Focus();
}
}
}
更新
CustomEntry.xml.cs
namespace Mobile.App
{
public class CustomEntry : Entry
{
public delegate void BackspaceEventHandler(object sender, EventArgs e);
public event BackspaceEventHandler OnBackspace;
public CustomEntry() { }
public void OnBackspacePressed()
{
OnBackspace?.Invoke(null, null);
}
}
}
CustomEntryRenderer
[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace Mobile.App.Droid
{
public class CustomEntryRenderer : EntryRenderer, IInputFilter
{
public CustomEntryRenderer(Context context) : base(context)
{
}
public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
if (string.IsNullOrWhiteSpace(source.ToString()))
{
var entry = (CustomEntry)Element;
entry.OnBackspacePressed();
}
return source;
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control == null)
{
return;
}
if (Control != null)
{
int length = Control.Text.Length;
Control.SetSelection(length);
SetColors();
};
Control.SetFilters(new IInputFilter[] { this });
}
private void SetColors()
{
Control.SetBackgroundColor(Android.Graphics.Color.Transparent);
}
}
}
.xml.cs
public partial class PasswordPage : ContentPage
{
public List<Entry> entryList { get; set; }
public PasswordPage()
{
InitializeComponent();
ValidatePassword();
entryList = new List<Entry>();
entryList.Add(PasswordOne);
entryList.Add(PasswordTwo);
entryList.Add(ConfirmPasswordOne);
entryList.Add(ConfirmPasswordTwo);
}
Entry entry;
private void Entry_FieldChanged(object sender, TextChangedEventArgs e)
{
entry = sender as Entry;
const string numregex = "^[0-9]+$";
if (!(!System.Text.RegularExpressions.Regex.IsMatch(entry.Text, numregex) || entry.Text == ""))
{
if (entry.Text.Length >= 1)
{
var index = entryList.IndexOf(entry);
var nextIndex = (index + 1) >= entryList.Count ? 0 : index + 1;
var next = entryList.ElementAt(nextIndex);
if (entry == ConfirmPasswordTwo)
{ }
else
{
next?.Focus();
}
}
}
//else
//{
// var index = entryList.IndexOf(entry);
// var prevIndex = (index) == 0 ? 0 : index - 1;
// var prev = entryList.ElementAt(prevIndex);
// if (entry == PasswordOne)
// { }
// else
// {
// prev?.Focus();
// }
//}
}
private void CustomEntry_OnBackspace(object sender, EventArgs e)
{
const string numregex = "^[0-9]+$";
if (!(System.Text.RegularExpressions.Regex.IsMatch(entry.Text, numregex) || entry.Text == ""))
{
var last = entryList.ElementAt(entryList.Count - 1);
last?.Focus();
}
else
{
return;
}
}
}
.xml
<local:CustomEntry
x:Name="PasswordOne"
IsPassword="True"
Keyboard="Numeric"
MaxLength="1"
ReturnType="Next"
TextChanged="Entry_FieldChanged"
OnBackspace="CustomEntry_OnBackspace"
Unfocused="Password_Unfocused" />
【问题讨论】:
-
你的退格键是什么?在键盘?当你按下这个按钮时,你想专注于最后一个吗?
-
是的,是的,是的
标签: c# .net xamarin xamarin.forms