Есть ли способ получить событие, запускаемое при нажатии клавиши удаления, когда запись пуста в формах xamarin? - PullRequest
0 голосов
/ 13 января 2019

Таким образом, у меня есть четыре разных записи, которые действуют как держатель ввода вывода, и я пытаюсь сделать так, чтобы каждая запись, когда нажата клавиша Backspace, переходила к предыдущей записи с учетом записи, на которой была нажата клавиша Backspace. пуст.

Я пытался сделать это в Renderer, но он ничего не запускает, когда он пустой, то же самое относится и к 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();
            }
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

В 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

Вы можете попробовать переопределить метод DeleteBackward в настраиваемом текстовом поле (BackDeleteEventTextField) и вызвать настраиваемое событие 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);
        }
0 голосов
/ 13 января 2019

Чтобы проверить, если строка пуста, вы можете просто:

(string.IsNullOrWhiteSpace(value))

После этого нужно просто сфокусироваться и снять фокус с нужных вам записей.

...