TextChanged запускается несколько раз на MaskEditing - PullRequest
0 голосов
/ 16 февраля 2019

Я уже проверил подобные вопросы, но не смог найти никакого рабочего ответа, мой собственный код

Я хотел написать код для редактирования текстовой маски, но при отладке кода он вызывал несколькокаждый раз, когда я пишу текст внутри текстового поля

Это корректно работает в первый раз, но это как в цикле for и многократно выполняет метод.

Помогите мне!

   public class Resp
    {
        public string Text { get; set; }
        public int Caret { get; set; }
    }

    public static Resp Masker(this string text, string mask, int caretIndex, bool ShowPlaceHolder)
    {
        string result;
        if (text.Length <= mask.Length || caretIndex > 0)
        {
            var workingArray = new List<int>();
            var maskArray = mask.ToArray();
            for (var i = 0; i < mask.Length; i++)
                if (maskArray[i] == '_')
                    workingArray.Add(i);

            var textArray = text.ToArray();
            var resultArray = new List<char>();

            var indicator = 0;
            for (var i = 0; i < maskArray.Length; i++)
            {
                var current = maskArray[i];

                var writableIndex = workingArray.IndexOf(i);
                if (writableIndex == -1 || indicator == text.Length)
                {
                    resultArray.Add(current);
                    continue;
                }

                resultArray.Add(textArray[indicator]);
                indicator++;
            }

            result = string.Concat(resultArray);
        }
        else
        {
            result = text;
        }

        return new Resp
        {
            Text = result,
            Caret = caretIndex
        };
    }

    private void TxtMobile_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        if (!(sender is TextBox textBox)) return;

        var process = textBox.Text.Masker("09__ ___ ____", textBox.CaretIndex, true);
        textBox.Text = process.Text;
        textBox.CaretIndex = process.Caret;
    }

1 Ответ

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

Он обязательно будет запущен несколько раз, потому что вы изменяете текст TextBlock в его обработчике TextChanged, что приводит к рекурсивным вызовам - изменяя текст, вы запускаете другое событие TextChanged.

Старый прием для обхода этого - временно отменить регистрацию обработчика событий перед изменением текста и заново зарегистрировать обработчик после внесения изменений.Как это

var process = textBox.Text.Masker("09__ ___ ____", textBox.CaretIndex, true);
textBox.TextChanged -= TxtMobile_OnTextChanged; //unregister 
textBox.Text = process.Text;
textBox.TextChanged += TxtMobile_OnTextChanged; //re-register
textBox.CaretIndex = process.Caret;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...