Я не могу точно сказать вам, что делает WPF, но под капотом в окнах текст элемента управления обычно обновляется, посылая окну сообщение.Это помещается в очередь сообщений приложения и обрабатывается только тогда, когда поток пользовательского интерфейса приступает к обработке сообщений - поэтому, если управление обрабатывается вашим потоком пользовательского интерфейса, тогда вы должны завершить инициализацию и вернуть управление в основной цикл обработки сообщений.(или вызовите DoEvents ()) до того, как элемент управления получит и обработает сообщение.то есть это происходит асинхронно.(Вы также можете «опубликовать» сообщение для элемента управления, который ожидает, пока элемент управления обработает сообщение, прежде чем оно вернется в ваш код, но возможно / вероятно, что WPF не вызывает его таким образом)
Самое простое решение - поместить переменную guard в ваш класс, чтобы избежать реакции на «внутренние» вызовы, и обработчик событий игнорирует события, когда они установлены:
bool suppressTextChanged;
void Initialize()
{
suppressTextChanged = true;
control.SetText("abcd");
suppressTextChanged = false;
...
}
void Control_TextChanged(object sender, EventArgs e)
{
if (suppressTextChanged) return;
...
}
Это уродливо, но эффективнорешение.Жаль, что окна никогда не обеспечивали способ дифференциации управляемых пользователем событий (например, текста, измененного пользователем, который редактировал его в элементе управления) и внутренних событий (управляемых вашей программой, обновляющих элемент управления внутри) - хотя для некоторых событий вы можете использовать«отправитель» для определения источника события, чтобы определить, как оно было инициировано.