我已经检查过类似的问题,但是我自己的代码找不到任何有效的答案
我想编写代码进行文本蒙版编辑 但是当我即时调试代码时,每次我在文本框内编写文本时都会触发多次
它在第一次就可以正确工作,但是就像在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;
}
答案 0 :(得分:2)
由于要在TextBlock
事件处理程序中更改TextChanged
的文本,因此肯定会多次触发,这会导致递归调用-通过更改要触发的文本{ {1}}事件。
解决此问题的一个老技巧是在更改Text之前临时注销事件处理程序,并在进行更改后重新注册处理程序。像这样
TextChanged