2010-01-22 7 views
16

J'ai un simple WrapPanel qui contient un certain nombre de contrôles larges. Lorsque je redimensionne le Width du Window tout fonctionne comme prévu. Les contrôles vont traverser sur une seule ligne s'il y a assez d'espace ou s'enrouler à la ligne suivante quand il n'y en a pas. Cependant, ce qui doit arriver, c'est que si toutes les commandes sont empilées verticalement (puisqu'il n'y a plus d'espace horizontal) et que le Width du Window diminue encore plus, une barre de défilement horizontale apparaît de sorte que je peut défiler et voir le contrôle entier si je veux. Voici mon xaml. J'ai essayé d'emballer le WrapPanel dans un ScrollViewer mais je n'ai pas pu atteindre mon objectif.WPF wrap panel et scrolling

<Window x:Class="WpfQuotes.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="Auto" Width="600" Foreground="White"> 
    <WrapPanel> 
     <Button Width="250">1</Button> 
     <Button Width="250">2</Button> 
     <Button Width="250">3</Button> 
    </WrapPanel> 
</Window> 

Donc, si vous réduisez le Width du Window ci-dessus à son minimum, vous ne serez pas en mesure de voir le texte des boutons. Je voudrais qu'une barre de défilement horizontale apparaisse afin que je puisse faire défiler pour voir le texte mais ne pas interférer avec la fonctionnalité d'emballage habituelle.

Merci.

Mise à jour: J'ai suivi la suggestion de Paul ci-dessous et la barre de défilement horizontale apparaît comme prévu maintenant. Cependant, je voulais aussi que le défilement vertical soit disponible, donc j'ai réglé VerticalScrollBarVisibility="Auto". La chose est, si je redimensionne la fenêtre de sorte qu'une barre de défilement verticale apparaît, l'horizontale apparaît toujours, même si elle n'est pas nécessaire (il y a assez d'espace horizontal pour voir le contrôle entier). Il semble que la barre de défilement verticale apparaît en train de jouer avec la largeur du scrollviewer. Y a-t-il un moyen de corriger cela afin que la barre de défilement horizontale n'apparaisse que si elle est vraiment nécessaire?

Ci-dessous mon XAML et le code que j'ai ajouté dans le CustomWrapPanel:

<Window x:Class="Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cwp="clr-namespace:CustomWrapPanelExample" 
     Title="Window1" Height="Auto" Width="300" Foreground="White" Name="mainPanel"> 
    <ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto" 
       VerticalScrollBarVisibility="Auto"> 
    <cwp:CustomWrapPanel Width="{Binding ElementName=MyScrollViewer, Path=ActualWidth}"> 
     <Button Width="250">1</Button> 
     <Button Width="250">2</Button> 
     <Button Width="250">3</Button> 
     <Button Width="250">4</Button> 
     <Button Width="250">5</Button> 
     <Button Width="250">6</Button> 
     <Button Width="250">7</Button> 
     <Button Width="250">8</Button> 
     <Button Width="250">9</Button> 
    </cwp:CustomWrapPanel> 
    </ScrollViewer> 
</Window> 

La seule chose de substitution dans CustomWrapPanel:

protected override Size MeasureOverride(Size availableSize) 
{ 
    double maxChildWidth = 0; 
    if (Children.Count > 0) 
    { 
    foreach (UIElement el in Children) 
    { 
     if (el.DesiredSize.Width > maxChildWidth) 
     { 
     maxChildWidth = el.DesiredSize.Width; 
     } 
    } 
    }  
    MinWidth = maxChildWidth; 
    return base.MeasureOverride(availableSize); 
} 
+0

pouvez-vous poster le XAML avec le ScrollViewer? – hackerhasid

Répondre

43

est ici la chose, si vous allez utiliser une enveloppe panneau, il fait deux choses, il va prendre autant d'espace disponible dans une direction, et se développer au besoin dans l'autre. Par exemple, si vous le placez dans une fenêtre comme vous l'avez, il occupe autant d'espace horizontal que possible, puis se déploie vers le bas, c'est pourquoi une barre de défilement verticale fonctionnera, le conteneur parent dit "c'est je suis large, mais vous pouvez vous faire aussi grand que vous voulez verticalement », si vous le changez en barre de défilement horizontale, le défilement de la visionneuse dit essentiellement:« c'est à quelle hauteur vous pouvez être, mais vous pouvez être aussi large que vous voulez "dans ce cas, le panneau de retour ne s'enroule pas car il n'y a pas de contraintes horizontales.

Une solution possible est de changer la direction du panneau d'enveloppement enveloppe à l'horizontale à la verticale comme celui-ci (ce qui est probablement pas le comportement idéal ou prévu):

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
     <WrapPanel Orientation="Vertical"> 
      <Button Width="250">1</Button> 
      <Button Width="250">2</Button> 
      <Button Width="250">3</Button> 
     </WrapPanel> 
    </ScrollViewer> 

Afin d'obtenir le comportement de votre attendre, vous devrez faire quelque chose plus proche de celle-ci:

<ScrollViewer x:Name="MyScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
     <WrapPanel MinWidth="250" Width="{Binding ElementName=MyScrollViewer, Path=ViewportWidth}"> 
      <Button Width="250">1</Button> 
      <Button Width="250">2</Button> 
      <Button Width="250">3</Button> 
     </WrapPanel> 
    </ScrollViewer> 

Cependant, cette deuxième solution ne fonctionne que si vous connaissez déjà la largeur de vos éléments enfants, idéalement, vous voulez que votre largeur max à régler sur la largeur réelle de le plus grand élément enfant, mais en Pour ce faire, vous devez créer un contrôle personnalisé dérivé de wrap panel et écrire vous-même le code pour vérifier cela.

+0

Merci Paul. J'ai fait les changements comme vous l'avez décrit et ça marche beaucoup mieux maintenant. Cependant, je vois un petit problème w.r.t. défilement vertical. Je voulais également qu'une barre de défilement verticale apparaisse chaque fois que les éléments du panneau d'habillage ne sont pas entièrement visibles verticalement. J'ai édité mon post original pour montrer les changements que j'ai faits et le problème auquel je suis confronté. – Flack

+0

Ahh ... Joué un peu avec, tout ce que vous devez faire est de changer le chemin de liaison sur ActualWidth à ViewportWidth, lorsque la barre de défilement verticale est ajoutée, cela réduit la largeur de la fenêtre, même si le contrôle reste le même taille. Cela devrait résoudre le bug de la barre de défilement horizontal bizarre que vous voyez, et je mettrai à jour mon post. –

+0

Excellent! On dirait que ça fonctionne parfaitement maintenant. Merci beaucoup pour votre aide :) – Flack