WPF - центрирование содержимого в scrollviewer?

У меня есть scrollviewer, который содержит стекную панель элементов textblock (на самом деле это, вероятно, tabitems, я использую панель стека внутри scrollviewer, чтобы переопределить вкладку по умолчанию в шаблоне tabcontrol). То, что я хотел бы иметь, это сделать, когда выбранная вкладка будет изменена, переместите вновь выбранную вкладку в центр видимой области scrollviewer. В идеале это будет работать для всех вкладок, даже тех, которые находятся на дальних сторонах, но я соглашаюсь на то, что вы сможете прокрутить прокрутку, чтобы какой-то элемент был как можно ближе к центру.

Есть ли очевидные способы достижения этого в WPF? Все решения, о которых я могу сейчас думать, включают в себя большую работу над пользовательскими элементами управления.

enter image description here

Ответы

Ответ 1

ScrollViewer.ScrollToHorizontalOffset() - это то, что вы ищете. Просто нужно рассчитать, какое смещение вашего выбранного элемента относительно пакета стека. Вы можете получить что-то вроде selectedElement.TranslatePoint( new Point(), stackPanel)

Чтобы сделать эту работу для элементов в дальних концах, вам нужно добавить некоторые "пустые" элементы в начало и конец вашего scrollviewer, чтобы заняться соответствующим объемом пространства.

Чтобы сделать это довольно красивым, вызовите ScrollToHorizontalOffset в таймере, чтобы сделать прокрутку 'animate' вместо перехода

Ответ 2

Вы можете легко установить контент в центр, используя следующий код:

scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight / 2);
scrollviewer.ScrollToHorizontalOffset(scrollviewer.ScrollableWidth / 2);

Ответ 3

Это сработало для меня:

//for ScrollViewer s;
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth) / 2);
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight) / 2);