c# - 当 xamarin 表单中的条目为空时,有没有办法在按下删除时触发事件

标签 c# xamarin xamarin.forms textchanged xamarin.forms.entry

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

我尝试在渲染器中执行此操作,但当其为空时它不会触发任何内容,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();
            }
}

最佳答案

在 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 步: 创建自定义入口类并创建委托(delegate)来处理后退按钮按下

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 步:在自定义文本字段中,创建一个事件并委托(delegate)来处理删除按钮单击。

 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 步:在自定义渲染器 namespace 内,创建自定义渲染器类。

 public class CustomEntryRenderer: EntryRenderer, IUITextFieldDelegate
 {
 }

第 5 步:在自定义呈现器的 OnElementChanged 方法中创建自定义文本字段类型的文本字段。

第 6 步:通过将自定义文本字段删除事件传递给自定义条目后退按钮事件处理程序来处理该事件。

第 7 步:将自定义文本字段对象分配给 native 控件。

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

关于c# - 当 xamarin 表单中的条目为空时,有没有办法在按下删除时触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169553/

相关文章:

c# - .net 中 dll 的强名称

c# - 有没有办法通过 UserPrincipal 类设置新用户的域后缀?

c# - XmlAttribute 不适用于 XmlArray

android - 如何授予使用 usb 管理器打开 usb 设备的权限? openDevice() 总是返回 null

xamarin - 如何使用 Xamarin.Forms 在单元格中创建 >?

c# - 接口(interface)实现不提供async怎么办

c# - Xamarin Android 文件路径太长

android - 带滚动的 ListView 将页脚推出 UI Xamarin android

c# - 在 Regex C# 中允许撇号、点、符号、数字和字符

listview - 停止 Xamarin Forms ListView 中的单元格回收