TextChanged在MaskEditing上多次触发

时间:2019-02-16 14:53:47

标签: c# wpf

我已经检查过类似的问题,但是我自己的代码找不到任何有效的答案

我想编写代码进行文本蒙版编辑 但是当我即时调试代码时,每次我在文本框内编写文本时都会触发多次

它在第一次就可以正确工作,但是就像在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 :(得分:2)

由于要在TextBlock事件处理程序中更改TextChanged的文本,因此肯定会多次触发,这会导致递归调用-通过更改要触发的文本{ {1}}事件。

解决此问题的一个老技巧是在更改Text之前临时注销事件处理程序,并在进行更改后重新注册处理程序。像这样

TextChanged