Наткнулся на это сегодня. Интересно, что когда я смотрел на вещи с помощью Reflector.NET, я обнаружил, что исправление включает вызов UpdateLayout () для ContextLayoutManager, связанного с текущим Dispatcher. (читай: не нужно перебирать страницы).
По сути, вызываемый код (используйте отражение здесь):
ContextLayoutManager.From(Dispatcher.CurrentDispatcher).UpdateLayout();
Определенно ощущается как маленький недосмотр MS.
Для ленивых или незнакомых, этот код работает:
Assembly presentationCoreAssembly = Assembly.GetAssembly(typeof (System.Windows.UIElement));
Type contextLayoutManagerType = presentationCoreAssembly.GetType("System.Windows.ContextLayoutManager");
object contextLayoutManager = contextLayoutManagerType.InvokeMember("From",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, null, null, new[] {dispatcher});
contextLayoutManagerType.InvokeMember("UpdateLayout", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, contextLayoutManager, null);
FxCop будет жаловаться, но, возможно, это исправлено в следующей версии фреймворка. Код, размещенный автором, кажется «более безопасным», если вы предпочитаете не использовать рефлексию.
НТН!