C# TextChanged在屏蔽时多次触发

C# TextChanged在屏蔽时多次触发,c#,wpf,C#,Wpf,我已经检查了类似的问题,但我找不到任何工作答案我自己的代码 我想写一个代码来编辑文本掩码 但当我调试代码时,每次我在文本框中写文本时,它都会触发多次 它在第一次执行正确的操作,但就像在for循环中一样,多次执行该方法 救救我 public class Resp { public string Text { get; set; } public int Caret { get; set; } } public static Resp

我已经检查了类似的问题,但我找不到任何工作答案我自己的代码

我想写一个代码来编辑文本掩码 但当我调试代码时,每次我在文本框中写文本时,它都会触发多次

它在第一次执行正确的操作,但就像在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;
    }
公共类响应
{
公共字符串文本{get;set;}
公共int插入符号{get;set;}
}
公共静态响应掩码(此字符串文本、字符串掩码、int caretIndex、bool ShowPlaceHolder)
{
字符串结果;
如果(文本长度0)
{
var workingArray=新列表();
var maskArray=mask.ToArray();
对于(变量i=0;i
它肯定会被触发多次,因为您正在其
TextChanged
事件处理程序中更改
TextBlock
的文本,这会导致递归调用-通过更改文本,您将触发另一个
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;

text每个字符后都会触发更改事件,这不是你的问题吗?@iSpain17否,当我输入一个字符时,它第一次正确地使用了
Masker
方法。但在此之后,如果(!(发送者是TextBox TextBox))返回,则将输入
text
更改为
mask
这不能是compiled@kennyzx不,在你提出建议后,结果没有变化。我认为问题在于
遮罩中的lopp
method@ArashSh我只是说这行在语法上是错误的,如果(!(发送者是TextBox))return,它应该是
,对吗?哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟。顺便说一下,我认为
C#7+