C# 当xamarin表单中的条目为空时,是否有方法在按下delete键时触发事件

C# 当xamarin表单中的条目为空时,是否有方法在按下delete键时触发事件,c#,xamarin,xamarin.forms,textchanged,xamarin.forms.entry,C#,Xamarin,Xamarin.forms,Textchanged,Xamarin.forms.entry,所以我有四个不同的条目,充当pin输入保持器,我想做的是,基本上,当按下backspace时,每个条目都应该转到前一个条目,考虑到按下backspace的条目是空的 我试着在渲染器中执行它,但当它为空时不会触发任何东西,TextChanged也是如此 我试图做的是一个小的改动,在中,我试图在初始化时在所有条目中放置“”,这是一个空格,当用户试图放置某个内容时,我会检查旧值和新值,并替换它,但问题似乎是当我导航到第二个条目并按下backspace时,然后,我应该能够进入第一个条目,这是我无法理解的

所以我有四个不同的条目,充当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上使用自定义渲染器应该是完全可能的