À l'aide de WrapPanel et ScrollViewer pour donner un multi-colonne Listbox dans WPF
Je suis en train de faire une simple application MÉTIER qui charge les données à partir d'un fichier XML et l'affiche dans une liste avec quelques boutons à l'édition.
Dans ma première tentative, tout était ok, sauf que la liste défile vers le bas dans une longue colonne. Je préfère que les données d'enveloppe de sorte que, au bas de la Fenêtre, il démarre une deuxième colonne et ainsi de suite – si vous redimensionnez la Fenêtre de données doit redimensionner en conséquence.
Tout d'abord, je viens de mettre la liste à l'intérieur d'un ScrollViewer. Cela ne fait aucune différence que ce soit.
Ensuite, j'ai ajouté un WrapPanel au sein de l'ItemTemplate. À ce stade, j'ai eu une longue ligne horizontale, mais il n'a jamais enroulée sur une deuxième ligne, en dépit de mon réglage du ScrollViewer.HorizontalScrollbar=désactivé.
J'ai cherché partout sur le web sur divers blogs et forums, mais ne peut pas voir la différence entre les suggestions et mon code (ci-dessous). Des conseils seront très appréciés.
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="My App" Height="300" Width="400"
FocusManager.FocusedElement="{Binding ElementName=eventsList}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Row="0" Grid.Column="0" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<ListBox Name="eventsList">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</ScrollViewer>
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center" Visibility="Collapsed">
<Button Name="action1Button" />
<Button Name="action2Button" />
<Button Name="action3Button" />
</StackPanel>
</Grid>
</Window>
OriginalL'auteur Saqib | 2009-05-25
Vous devez vous connecter pour publier un commentaire.
Il semble comme si vous étiez sur la bonne voie: remplacement de la ItemsPanelTemplate dans la zone de liste avec un WrapPanel, réglage WrapPanel de l'Orientation à la Verticale, et la mise ScrollViewer.VerticalScrollBar pour les Handicapés doivent être tout ce que vous devez faire.
Cela fonctionne pour moi:
Qui devraient conduire à rendre une colonne entière à la verticale, envelopper, puis continuer sur la colonne suivante, le défilement comme nécessaire à l'horizontale (mais pas à la verticale), comme dans l'image:
La clé de choses dans cette mise en œuvre sont
3 Ans plus tard... Ce post est toujours très utile, merci!
utile 8 ans plus tard , et aussi si vous voulez faire défiler une enveloppe panneau uniquement à la verticale : ScrollViewer.HorizontalScrollBarVisibility="Disabled">
OriginalL'auteur Nicholas Armstrong
Je crois que pour ce faire, vous devez écrire du code personnalisé, - vous avez eu la bonne idée de remplacer la ItemsPanelTemplate, mais WrapPanel ne pas commander des trucs de la façon dont vous le souhaitez - il vais commander des trucs comme:
Alors que vous, vous voulez probablement:
Aussi, en le mettant dans un ScrollViewer, c'est comme dire qu'il a une infinité de taille d'écran, de sorte que le résultat sera juste une ligne (parce que le ScrollViewer va lui donner autant de place que ce qu'il demande). L'écriture d'un panneau n'est pas difficile, il est fondamentalement juste deux fonctions (Mesure et Organiser).
OriginalL'auteur Paul Betts