Проблема не характерна для WPF - большинство каркасов пользовательского интерфейса ведут себя одинаково.
Проблема здесь в том, что ваш пользовательский интерфейс не будет обновляться, пока поток пользовательского интерфейса не сможет обрабатывать сообщения.Пока вы выполняете работу (операции, связанные с пользовательским интерфейсом), поток пользовательского интерфейса занят и не может обрабатывать сообщения, необходимые для перерисовки экрана.В этом случае это означает, что индикатор занятости не будет перерисовываться до тех пор, пока все не будет завершено.
Реальное решение здесь - переместить операции в фоновый поток.Хотя вы говорите, что все они связаны с потоками пользовательского интерфейса, обычно есть способ выделить его части в WPF.Главное - подумать о деталях, которые занимают много времени, и переместить их, и только их, наружу.Обычно это означает загрузку ваших данных, но не установку их в пользовательском интерфейсе (т. Е. Установку привязанного свойства) до тех пор, пока он не будет полностью загружен и обработан.
Если это совершенно невозможно, единственная реальная возможность - установитьиндикатор занятости, затем используйте какой-либо механизм, чтобы оттолкнуть другую работу до тех пор, пока поток пользовательского интерфейса не сможет ее обработать.Это можно сделать с помощью Dispatcher.BeginInvoke, чтобы отодвинуть оставшуюся работу до «позже», хотя это несколько хакерски.Это будет выглядеть следующим образом:
private void MyTree_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.MyBusyIndicator.IsBusy = true;
this.Dispatcher.BeginInvoke( (Action) () =>
{
// This is now sent to the dispatcher to process later, which gives the busy indicator a chance to refresh...
//then some UI related operation
this.MyBusyIndicator.IsBusy = false;
});
}
При этом, однако, это также не всегда совершенно надежно - так как вы все еще блокируете свой поток пользовательского интерфейса.В идеале, вы никогда не должны блокировать пользовательский интерфейс, так как это предотвратит корректное выполнение перерисовок ... DispatcherTimer будет работать более надежно, но, опять же, это действительно не очень хороший способ справиться с этим.