2

所以我有四个不同的条目,它们充当引脚输入保持器,而我要做的是,基本上按下退格键时的每个条目都应该转到上一个条目,考虑到按下退格键的条目是空的。

我尝试在渲染器中执行此操作,但是当它为空时它不会触发任何东西,TextChanged 也是如此

我想做的是一个小技巧,我试图在其中放置“”,这是初始化时所有条目中的一个空格,当用户尝试放置一些东西时,我会检查旧值和新值,并且替换它,但问题似乎是当我导航到第二个条目并假设我按退格键时,我应该能够进入第一个条目,这是我无法弄清楚的

下面是我试图做的一小部分,但它有一些问题,任何输入都会有帮助

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();
            }
}
4

3 回答 3

4

在 Xamarin.Android 中,您可以尝试处理编辑文本按键事件。当在键盘上按下删除按钮并相应地处理事件时,Keycode 是 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。

第 1 步:创建一个自定义入口类并创建一个委托来处理后退按钮按下

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 步:通过将自定义文本字段删除事件传递给自定义条目返回按钮事件处理程序来处理自定义文本字段删除事件。

第 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);
        }
于 2019-01-16T05:40:39.823 回答
0

我在接受的答案中发现 Xamarin.Android 的第一个示例对我有用,除了更改KeyCode.BackKeyCode.Del捕获退格键按下。

于 2022-02-05T01:04:17.353 回答
0

为了验证字符串是否为空,您可以:

(string.IsNullOrWhiteSpace(value))

之后,只需要关注和取消关注您需要的条目即可。

于 2019-01-13T17:11:09.413 回答