C# 当xamarin表单中的条目为空时,是否有方法在按下delete键时触发事件
所以我有四个不同的条目,充当pin输入保持器,我想做的是,基本上,当按下backspace时,每个条目都应该转到前一个条目,考虑到按下backspace的条目是空的 我试着在渲染器中执行它,但当它为空时不会触发任何东西,TextChanged也是如此 我试图做的是一个小的改动,在中,我试图在初始化时在所有条目中放置“”,这是一个空格,当用户试图放置某个内容时,我会检查旧值和新值,并替换它,但问题似乎是当我导航到第二个条目并按下backspace时,然后,我应该能够进入第一个条目,这是我无法理解的 下面是我试图做的一个小片段,但它有一些问题,任何输入都会有帮助C# 当xamarin表单中的条目为空时,是否有方法在按下delete键时触发事件,c#,xamarin,xamarin.forms,textchanged,xamarin.forms.entry,C#,Xamarin,Xamarin.forms,Textchanged,Xamarin.forms.entry,所以我有四个不同的条目,充当pin输入保持器,我想做的是,基本上,当按下backspace时,每个条目都应该转到前一个条目,考虑到按下backspace的条目是空的 我试着在渲染器中执行它,但当它为空时不会触发任何东西,TextChanged也是如此 我试图做的是一个小的改动,在中,我试图在初始化时在所有条目中放置“”,这是一个空格,当用户试图放置某个内容时,我会检查旧值和新值,并替换它,但问题似乎是当我导航到第二个条目并按下backspace时,然后,我应该能够进入第一个条目,这是我无法理解的
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))
在此之后,只需关注焦点问题,并取消对所需条目的关注。为了验证字符串是否为空,您可以:
(string.IsNullOrWhiteSpace(value))
在这之后,只需关注焦点并取消对所需条目的关注。在Xamarin.Android中,您可以尝试处理编辑文本按键事件。Keycode是Keycode。当按下键盘上的delete按钮时返回,并相应地处理事件
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方法,并调用自定义事件OnDeleteBackardKeyPressed
在自定义渲染器中,您可以使用“on element changed”方法中的自定义文本字段覆盖文本字段
var textField = new BackDeleteEventTextField();
并处理自定义事件OnDeleteBackardKeypressed
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
步骤1:
创建一个自定义条目类并创建一个委托来处理back按钮的按下
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:在自定义渲染器命名空间中,创建自定义文本字段类
[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:在自定义渲染器名称空间中,创建自定义渲染器类
public class CustomEntryRenderer: EntryRenderer, IUITextFieldDelegate
{
}
步骤5:在自定义渲染器的OnElementChanged方法中创建自定义文本字段类型的文本字段
步骤6:通过将自定义文本字段delete事件传递给自定义返回按钮事件处理程序来处理该事件
步骤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);
}
在Xamarin.Android中,您可以尝试处理编辑文本按键事件。Keycode是Keycode。当按下键盘上的delete按钮时返回,并相应地处理事件
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方法,并调用自定义事件OnDeleteBackardKeyPressed
在自定义渲染器中,您可以使用“on element changed”方法中的自定义文本字段覆盖文本字段
var textField = new BackDeleteEventTextField();
并处理自定义事件OnDeleteBackardKeypressed
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
步骤1:
创建一个自定义条目类并创建一个委托来处理back按钮的按下
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:在自定义渲染器命名空间中,创建自定义文本字段类
[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:在自定义渲染器名称空间中,创建自定义渲染器类
public class CustomEntryRenderer: EntryRenderer, IUITextFieldDelegate
{
}
步骤5:在自定义渲染器的OnElementChanged方法中创建自定义文本字段类型的文本字段
步骤6:通过将自定义文本字段delete事件传递给自定义返回按钮事件处理程序来处理该事件
步骤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);
}
验证很好,但当其emptyvalidation很好时,我无法获取事件本身,但当其emptyvalidation很好时,我无法获取事件本身。当条目为空时,我无法找到任何方法来检测delete键。即使在本机iOS中也不存在,即,即使对于UITextField也不存在。有一个功能请求添加此功能(检测按键):@jgoldberger MSFT很高兴您在我的一个线程上再次回复:),是否有任何方法可以实现此目的??在iOS上,我找不到方法,因为我无法在iOS期间处理按键,因此,即使使用自定义渲染器,我也无法在iOS上获得按键事件。iOS似乎不发送按键事件,只发送文本字段的文本更改事件。在Android上使用自定义渲染器是可能的,但我必须研究一下。在UWP上使用自定义渲染器应该是完全可能的。由于缺少iOS提供的按键事件,Xamarin.Forms很难在所有平台上实现按键观察程序。当条目为空时,我找不到任何方法来检测delete键。即使在本机iOS中也不存在,即,即使对于UITextField也不存在。有一个功能请求添加此功能(检测按键):@jgoldberger MSFT很高兴您在我的一个线程上再次回复:),是否有任何方法可以实现此目的??在iOS上,我找不到方法,因为我无法在iOS期间处理按键,因此,即使使用自定义渲染器,我也无法在iOS上获得按键事件。iOS似乎不发送按键事件,只发送文本字段的文本更改事件。在Android上使用自定义渲染器是可能的,但我必须研究一下。在UWP上使用自定义渲染器应该是完全可能的