Comment faire des articles dans un DockPanel développer pour adapter l'espace disponible dans WPF?
-
13-09-2019 - |
Question
J'ai un StackPanel
contenant un StackPanel
et d'autres articles. Le premier StackPanel
a une orientation verticale, l'une interne a une orientation horizontale. L'une interne a une TreeView
et un ListView
, je souhaite qu'elles se dilatent et la largeur de la fenêtre, que je fixé par la fenêtre et permettre à l'utilisateur de changer. Je voudrais également le StackPanel
extérieur pour adapter à la hauteur de la fenêtre. Comment puis-je faire?
Edit:
Je l'ai converti en utilisant un DockPanel
, et je l'ai définir les propriétés de DockPanel.Dock
correctement dans chacun des éléments, et ont LastChildFill
désactivé dans les deux dockpanels, la mise en page ne fonctionne toujours pas extensible.
Le code:
<Window x:Class="Clippy.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<DockPanel Name="wrapperDockPanel" LastChildFill="False">
<Menu Height="22" Name="mainMenu" Width="Auto" DockPanel.Dock="Top" />
<ToolBar Height="26" Name="mainToolBar" Width="Auto" DockPanel.Dock="Top" />
<DockPanel Height="Auto" Name="contentDockPanel" DockPanel.Dock="Top" LastChildFill="False">
<TreeView Name="categoryTreeView" />
<ListView Name="clipListView" />
</DockPanel>
<StatusBar Height="23" Name="mainStatusBar" DockPanel.Dock="Top" />
</DockPanel>
</Window>
La solution
Cela devrait le faire - je l'ai mis en place afin que le TreeView et ListView ont partagé la vue principale 50/50; si vous ne voulez pas, réglez-le sur « Auto » et « * » ou quelque chose. Utilisez "LastChildFill" à votre avantage!
<Window x:Class="Clippy.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<DockPanel LastChildFill="True">
<Menu Width="Auto" DockPanel.Dock="Top" />
<ToolBar Width="Auto" DockPanel.Dock="Top" />
<StatusBar DockPanel.Dock="Bottom" />
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*" />
<RowDefinition Height="0.5*" />
</Grid.RowDefinitions>
<TreeView Name="categoryTreeView" Grid.Row="0" />
<ListView Name="clipListView" Grid.Row="1" />
</Grid>
</DockPanel>
</Window>
Autres conseils
Utilisez un DockPanel à la place. StackPanel ne se soucie pas explicitement sur l'espace visible, alors que DockPanel fait l'ensemble de ses calculs de taille en fonction de l'espace disponible.
Mise à jour:
De plus, dans mon expérience, mettre le corps de la fenêtre dans une vue, et seulement avoir la vue dans la fenêtre fait pour une meilleure expérience de Taille automatique.
Pour une raison quelconque, mettre tous les enfants directement dans la fenêtre semble pas la taille auto très bien.
Mise à jour 2:
Je supprimerais l'attribut explicite de DockPanel.Dock de l'élément que vous voulez étirer (remplir) l'espace inutilisé.
Définir les propriétés de largeur et de hauteur "auto"