2011-04-14 4 views
14

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

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

enter image description here

+0

Скриншот, чтобы помочь с объяснением: [http://img20.imageshack.us/i/tabscreenshot.png/](http://img20. imageshack.us/i/tabscreenshot.png/) –

+2

@Robert Levy: Это не то, как это должно быть сделано, если ответ не отвечает на вопрос, нет необходимости принимать какие-либо из них. –

ответ

7

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

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

Чтобы сделать это выглядеть красиво, называют ScrollToHorizontalOffset в таймере, чтобы сделать прокрутку «одушевленным» вместо прыжка

12

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

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

Спасибо за этот отзыв. Я шаблон MVVM, и мне нужно, чтобы изображение было сосредоточено во время масштабирования. Я просто использовал команду в моем событии ScrollChanged и передал свой scrollviewer в качестве параметра в команду. Оттуда я смог сохранить свой контент-центр с моего ViewModel. Кажется, что-то вроде взлома. Я, вероятно, в конечном итоге создам собственный scrollviewer, который позволит мне делать это через свойства зависимостей. – KyleLib

0

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

//for ScrollViewer s; 
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth)/2); 
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight)/2); 
Смежные вопросы