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

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

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

enter image description here

3 ответов


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

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

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


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

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

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

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