У нас есть TreeView
в нашем приложении со следующими требованиями:Как выполнять последовательные вызовы BringIntoView в WPF?
Когда элемент добавляется:
- Вновь добавленный элемент прокручивается в поле зрения
- Родитель вновь добавленного элемента является также прокручивается в поле зрения.
- Если они слишком далеко, чтобы оба были замечены одновременно, элемент имеет приоритет.
Это кажется простым, просто сначала прокрутите родительский элемент, а затем прокрутите его.
Проблема заключается в том, когда вы называете это так:
parent.BringIntoView();
child.BringIntoView();
... только второй один, кажется, никакого эффекта. Первый в основном игнорируется.
Затем я попытался обертыванием второго вызова в BeginInvoke()
вызова, как это:
parent.BringIntoView();
Dispatcher.BeginInvoke((Action)(() => {
child.BringIntoView();
}));
Который делает работу, но теперь вы можете наглядно увидеть TreeView
свиток дважды; один раз для родителя, затем через мгновение, для ребенка, который выглядит просто плохо.
Так как я могу позвонить BringIntoView
назад, но без проблемы с повторным обновлением использования диспетчера?
Код, который я пробовал, фактически * в * загруженном событии для узла, но это не проблема. Опять же, проблема заключается в обратном вызове BringIntoView, где первый из них в основном узурпирован вторым и оказывается неэффективным. – MarqueIV
Тем не менее, я считаю, что ваше решение отложить второй вызов имеет смысл. Проблема в том, что он слишком долго задерживается, и это происходит после рендеринга (вызывая видимость двойного обновления). Если Loaded уже произошло, попробуйте [LayoutUpdated] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.layoutupdated.aspx). – nmclean
Но это его собственное событие. Помните ... это действие запускается пользователем. Можете ли вы показать мне, как бы вы подключили это, чтобы вы могли ответить пользователю, а затем ответить на системное событие как часть той же транзакции. – MarqueIV