当 xamarin 表单中的条目为空时,是否有一种方法可以在按下删除时触发事件
Is there a way to get a event fired when delete is pressed when an entry is empty in xamarin forms
所以我有四个不同的条目,它们充当 pin 输入支架,我想做的是,基本上每个条目在按下后退 space 时都应该转到上一个条目,考虑到按下后退space 的条目为空。
我尝试在 Renderer 中执行此操作,但当它为空时它不会触发任何东西,TextChanged 也是如此
我试图做的是一个小技巧,我试图在其中放入“”,即初始化时所有条目中的 space,当用户尝试放置一些东西时,我会检查旧值和新值,并替换它,但问题似乎是当我导航到第二个条目并假设我按后退 space,那么我应该能够进入第一个条目,即我无法弄清楚如何
下面是我尝试做的一小段,但它有一些问题,任何输入都会有所帮助
private void secondEntry_TextChanged(object sender, TextChangedEventArgs e)
{
if (e.OldTextValue == null && !e.NewTextValue.Equals(" "))
{
Entry_Second.Text = e.NewTextValue;
Entry_Third.Focus();
}
else if (e.NewTextValue == "")
{
Entry_Second.Text = " ";
}
else
{
Entry_Second.Focus();
}
}
为了验证字符串是否为空,您可以:
(string.IsNullOrWhiteSpace(value))
之后,只需要关注和取消关注您需要的条目。
在Xamarin.Android中,您可以尝试处理编辑文本按键事件。当在键盘上按下删除按钮并相应地处理事件时,键码是 Keycode.Back。
editText.KeyPress += (object sender, View.KeyEventArgs e) => {
e.Handled = false;
if (e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Back)
{
//your logic here
e.Handled = true;
}
};
在Xamarin.iOS
您可以尝试覆盖自定义文本字段 (BackDeleteEventTextField) 中的 DeleteBackward 方法并调用自定义事件 OnDeleteBackwardKeyPressed。
在自定义呈现器中,您可以在元素更改方法中使用自定义文本字段覆盖文本字段
var textField = new BackDeleteEventTextField();
并处理自定义事件 OnDeleteBackwardKeyPressed
textField.OnDeleteBackwardKeyPressed += (sender, a) =>
{
//handle the back key pressed event
};
在Xamarin.Android中:
在自定义渲染器中,您可以处理按键事件并查找 Keycode.Back
((EditText)this.Control).KeyPress += (object sender, View.KeyEventArgs even) => {
even.Handled = false;
if (even.Event.Action == KeyEventActions.Down && even.KeyCode == Keycode.Back)
{
//your logic here even.Handled = true;
}
};
更新
使用表格为 xamarin.iOS 进行详细说明。
第一步:
创建一个自定义条目 class 并创建一个委托来处理后退按钮按下
public class CustomEntry: Entry
{
public delegate void BackButtonPressEventHandler(object sender, EventArgs e);
public event BackButtonPressEventHandler OnBackButton;
public CustomEntry() { }
public void OnBackButtonPress()
{
if (OnBackButton!= null)
{
OnBackButton(null, null);
}
}
}
第 2 步:在自定义渲染器名称space 中,创建一个自定义文本字段 class.
[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace Origination.iOS.Renderers
{
public class CustomTextField: UITextField
{
}
}
第 3 步:在自定义文本字段中,创建事件并委托处理删除按钮点击。
public class CustomTextField: UITextField
{
// A delegate type for hooking up change notifications.
public delegate void DeleteBackwardKeyEventHandler(object sender, EventArgs e);
// An event that clients can use to be notified whenever the
// elements of the list change.
public event DeleteBackwardKeyEventHandler OnDeleteBackwardKey;
public void OnDeleteBackwardKeyPressed()
{
if (OnDeleteBackwardKey != null)
{
OnDeleteBackwardKey(null, null);
}
}
public override void DeleteBackward()
{
base.DeleteBackward();
OnDeleteBackwardKeyPressed();
}
}
第 4 步:在自定义渲染器名称 space 中,创建自定义渲染器 class。
public class CustomEntryRenderer: EntryRenderer, IUITextFieldDelegate
{
}
步骤 5:Within 自定义呈现器的 OnElementChanged 方法创建自定义文本字段类型的文本字段。
第 6 步:通过将自定义文本字段删除事件传递给自定义条目后退按钮事件处理程序来处理自定义文本字段删除事件。
第 7 步:将自定义文本字段对象分配给本机控件。
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
if (Element == null)
{
return;
}
var entry = (CustomEntry)Element;
var textField = new CustomTextField();
textField.EditingChanged += OnEditingChanged;
textField.OnDeleteBackwardKey += (sender, a) =>
{
entry.OnBackButtonPress();
};
SetNativeControl(textField);
base.OnElementChanged(e);
}
第 8 步:添加编辑更改处理程序
IElementController ElementController => Element as IElementController;
void OnEditingChanged(object sender, EventArgs eventArgs)
{
ElementController.SetValueFromRenderer(Entry.TextProperty, Control.Text);
}
除了将 KeyCode.Back
更改为 KeyCode.Del
以捕获退格键外,我发现已接受的答案中 Xamarin.Android 的第一个示例对我有用。
所以我有四个不同的条目,它们充当 pin 输入支架,我想做的是,基本上每个条目在按下后退 space 时都应该转到上一个条目,考虑到按下后退space 的条目为空。
我尝试在 Renderer 中执行此操作,但当它为空时它不会触发任何东西,TextChanged 也是如此
我试图做的是一个小技巧,我试图在其中放入“”,即初始化时所有条目中的 space,当用户尝试放置一些东西时,我会检查旧值和新值,并替换它,但问题似乎是当我导航到第二个条目并假设我按后退 space,那么我应该能够进入第一个条目,即我无法弄清楚如何
下面是我尝试做的一小段,但它有一些问题,任何输入都会有所帮助
private void secondEntry_TextChanged(object sender, TextChangedEventArgs e)
{
if (e.OldTextValue == null && !e.NewTextValue.Equals(" "))
{
Entry_Second.Text = e.NewTextValue;
Entry_Third.Focus();
}
else if (e.NewTextValue == "")
{
Entry_Second.Text = " ";
}
else
{
Entry_Second.Focus();
}
}
为了验证字符串是否为空,您可以:
(string.IsNullOrWhiteSpace(value))
之后,只需要关注和取消关注您需要的条目。
在Xamarin.Android中,您可以尝试处理编辑文本按键事件。当在键盘上按下删除按钮并相应地处理事件时,键码是 Keycode.Back。
editText.KeyPress += (object sender, View.KeyEventArgs e) => {
e.Handled = false;
if (e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Back)
{
//your logic here
e.Handled = true;
}
};
在Xamarin.iOS
您可以尝试覆盖自定义文本字段 (BackDeleteEventTextField) 中的 DeleteBackward 方法并调用自定义事件 OnDeleteBackwardKeyPressed。
在自定义呈现器中,您可以在元素更改方法中使用自定义文本字段覆盖文本字段
var textField = new BackDeleteEventTextField();
并处理自定义事件 OnDeleteBackwardKeyPressed
textField.OnDeleteBackwardKeyPressed += (sender, a) =>
{
//handle the back key pressed event
};
在Xamarin.Android中:
在自定义渲染器中,您可以处理按键事件并查找 Keycode.Back
((EditText)this.Control).KeyPress += (object sender, View.KeyEventArgs even) => {
even.Handled = false;
if (even.Event.Action == KeyEventActions.Down && even.KeyCode == Keycode.Back)
{
//your logic here even.Handled = true;
}
};
更新
使用表格为 xamarin.iOS 进行详细说明。
第一步: 创建一个自定义条目 class 并创建一个委托来处理后退按钮按下
public class CustomEntry: Entry
{
public delegate void BackButtonPressEventHandler(object sender, EventArgs e);
public event BackButtonPressEventHandler OnBackButton;
public CustomEntry() { }
public void OnBackButtonPress()
{
if (OnBackButton!= null)
{
OnBackButton(null, null);
}
}
}
第 2 步:在自定义渲染器名称space 中,创建一个自定义文本字段 class.
[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace Origination.iOS.Renderers
{
public class CustomTextField: UITextField
{
}
}
第 3 步:在自定义文本字段中,创建事件并委托处理删除按钮点击。
public class CustomTextField: UITextField
{
// A delegate type for hooking up change notifications.
public delegate void DeleteBackwardKeyEventHandler(object sender, EventArgs e);
// An event that clients can use to be notified whenever the
// elements of the list change.
public event DeleteBackwardKeyEventHandler OnDeleteBackwardKey;
public void OnDeleteBackwardKeyPressed()
{
if (OnDeleteBackwardKey != null)
{
OnDeleteBackwardKey(null, null);
}
}
public override void DeleteBackward()
{
base.DeleteBackward();
OnDeleteBackwardKeyPressed();
}
}
第 4 步:在自定义渲染器名称 space 中,创建自定义渲染器 class。
public class CustomEntryRenderer: EntryRenderer, IUITextFieldDelegate
{
}
步骤 5:Within 自定义呈现器的 OnElementChanged 方法创建自定义文本字段类型的文本字段。
第 6 步:通过将自定义文本字段删除事件传递给自定义条目后退按钮事件处理程序来处理自定义文本字段删除事件。
第 7 步:将自定义文本字段对象分配给本机控件。
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
if (Element == null)
{
return;
}
var entry = (CustomEntry)Element;
var textField = new CustomTextField();
textField.EditingChanged += OnEditingChanged;
textField.OnDeleteBackwardKey += (sender, a) =>
{
entry.OnBackButtonPress();
};
SetNativeControl(textField);
base.OnElementChanged(e);
}
第 8 步:添加编辑更改处理程序
IElementController ElementController => Element as IElementController;
void OnEditingChanged(object sender, EventArgs eventArgs)
{
ElementController.SetValueFromRenderer(Entry.TextProperty, Control.Text);
}
除了将 KeyCode.Back
更改为 KeyCode.Del
以捕获退格键外,我发现已接受的答案中 Xamarin.Android 的第一个示例对我有用。