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);