2011-04-14 6 views
14

J'ai un scrollviewer qui contient un empilement de blocs de texte (en fait, ce sont probablement des tabitems, j'utilise un stackpanel dans un scrollviewer pour remplacer le tabpanel par défaut dans un template tabcontrol). Ce que j'aimerais pouvoir faire, c'est quand l'onglet sélectionné est changé, déplacer l'onglet nouvellement sélectionné au centre de la zone visible du défilement. Idéalement, cela fonctionnerait pour tous les onglets, même ceux de l'autre côté, mais je me contenterais de pouvoir dire au scrollviewer de défiler de telle sorte qu'un élément particulier soit aussi proche du centré que possible.WPF - centrer le contenu dans un scrollviewer?

Existe-t-il des moyens évidents de réaliser cela dans WPF? Toutes les solutions auxquelles je peux penser en ce moment impliquent beaucoup de travail sur les contrôles personnalisés.

enter image description here

+0

Capture d'écran pour aider à expliquer: [http://img20.imageshack.us/i/tabscreenshot.png/](http://img20. imageshack.us/i/tabscreenshotmap.png/) –

+2

@Robert Levy: Ce n'est pas ce que l'on devrait faire, si aucune réponse ne répond à une question, il n'est pas nécessaire d'en accepter aucune. –

Répondre

7

ScrollViewer.ScrollToHorizontalOffset() est ce que vous recherchez. Juste besoin de calculer quel est le décalage de votre élément sélectionné par rapport à la pile. Pour que cela fonctionne pour les éléments situés aux extrémités, vous devez ajouter des éléments «vides» au début et à la fin de votre scrollviewer pour occuper l'espace approprié. .

Pour ce look assez, appelez ScrollToHorizontalOffset dans une minuterie pour faire le défilement « Animer » au lieu de sauter

12

Vous pouvez facilement définir le contenu au centre en utilisant le code suivant;

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

Merci pour ce conseil. Je suis un modèle MVVM et je devais garder une image centrée pendant le zoom. J'ai simplement utilisé une commande sur mon événement ScrollChanged et j'ai passé mon scrollviewer en paramètre à la commande. De là, j'ai pu conserver mon centre de contenu depuis mon ViewModel. Cela semble un peu un hack. Je vais probablement créer un scrollviewer personnalisé qui me permet de le faire via les propriétés de dépendance. – KyleLib

0

Cela a fonctionné pour moi:

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