63 votes

Comment faire en sorte qu'un modèle de données WPF occupe toute la largeur de la liste ?

J'ai un ListBox DataTemplate dans WPF. Je veux qu'un élément soit collé contre le côté gauche du ListBox et un autre élément soit collé contre le côté droit, mais je ne trouve pas comment faire cela.

Jusqu'à présent, j'ai un Grid avec trois colonnes, les colonnes de gauche et de droite ont du contenu et le centre est un espace réservé dont la largeur est définie sur "*". Où est-ce que je me trompe?

Voici le code:

0 votes

Pouvez-vous poster votre XAML pour que l'on puisse voir ce que vous avez fait jusqu'à présent?

145voto

Eric Haskins Points 4214

J'ai également dû définir :

HorizontalContentAlignment="Stretch"

sur le ListBox contenant.

5 votes

Ta pal. Cherché de l'aide sur Google et c'était sur le premier lien. Bien joué :)

0 votes

@Eric Haskins j'ai le même genre de problème pour le contrôle Pivot pour Windows Phone () Mais où dois-je mettre ce code? J'ai essayé quelques endroits mais je n'ai pas réussi à comprendre.

7 votes

Un message aux utilisateurs de Windows Phone - cela ne fonctionnera pas; la propriété est remplacée par le ItemContainerStyle du ListBox. Pour le faire fonctionner, consultez la réponse de Gabriel Mongeon ici: stackoverflow.com/questions/838828/…

24voto

Taeke Points 61
<Grid.Width>
    <Binding Path="ActualWidth" 
             RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}" />
</Grid.Width>

0 votes

J'aime la simplicité de cette approche. Non seulement cela garantit que les petits éléments remplissent la largeur, mais cela garantit également que les éléments dont le contenu préférerait être très large soient limités à la largeur de la liste.

0 votes

Exactement ce que je cherchais : remplir la largeur lorsqu'elle est trop petite et limiter la largeur lorsqu'elle est trop grande.

1 votes

Je viens de remarquer que cette solution provoque une largeur constamment légèrement inférieure à celle de l'élément ListBox, ce qui coupe un peu les éléments et active une barre de défilement horizontale en bas de la liste. J'ai corrigé cela en désactivant explicitement le défilement horizontal.

4voto

17 of 26 Points 15941

D'accord, voici ce que vous avez:

Colonne 0: WrapPanel
Colonne 1: Rien
Colonne 2: ListBox

Il semble que vous vouliez le WrapPanel sur le bord gauche, le ListBox sur le bord droit, et de l'espace pour occuper ce qu'il reste au milieu.

La manière la plus simple de faire cela est en fait d'utiliser un DockPanel, et non un Grid.

Cela devrait laisser de l'espace vide entre le WrapPanel et le ListBox.

2voto

vancutterromney Points 21

En prolongeant la réponse de Taeke, en définissant ScrollViewer.HorizontalScrollBarVisibility="Hidden" pour un ListBox, le contrôle enfant peut prendre la largeur du parent et ne pas afficher la barre de défilement.

1voto

Joel B Fant Points 14013

Le Grid devrait par défaut prendre toute la largeur du ListBox car le ItemsPanel par défaut pour celui-ci est un VirtualizingStackPanel. Je suppose que vous n'avez pas modifié ListBox.ItemsPanel.

Peut-être si vous supprimez le ColumnDefinition du milieu (les autres sont par défaut "*"), et mettez HorizontalAlignment="Left" sur votre WrapPanel et HorizontalAlignment="Right" sur le ListBox pour les numéros de téléphone. Vous devrez peut-être modifier un peu ce ListBox pour aligner encore plus à droite les numéros de téléphone, comme créer un DataTemplate pour eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X