Prévenir WPF contrôle de l'expansion au-delà de zone visible
J'ai un ItemsControl
dans mon de contrôle de l'utilisateur avec un parchemin spectateur autour d'elle pour quand il fait trop grand (Trop grand être le contenu est plus grand que la zone visible de la UserControl
). Le problème c'est que la grille qu'il est en expansion continue, de sorte que le défilement de la visionneuse jamais de coups de pied (à moins que je spécifier une hauteur exacte de la grille). Voir code ci-dessous et merci d'avance.
<UserControl x:Class="BusinessObjectCreationWizard.View.TableSelectionPageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<GroupBox FontWeight="Bold" Height="300px"
Header="Tables"
Padding="2">
<ScrollViewer>
<ItemsControl FontWeight="Normal"
ItemsSource="{Binding Path=AvailableTables}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Path=DisplayName}"
IsChecked="{Binding Path=IsSelected}"
Margin="2,3.5" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</UserControl>
Ce contrôle utilisateur est chargé ici
<Border Background="White" Grid.Column="1" Grid.Row="0">
<HeaderedContentControl Content="{Binding Path=CurrentPage}"
Header="{Binding Path=CurrentPage.DisplayName}" />
</Border>
Je voudrais ne pas spécifier la hauteur.
- L'expansion de la Grille dépend de ce qu'il contient. Vous devez vous montrer plus de votre XAML pour obtenir une réponse précise.
- J'ai ajouté un code supplémentaire (bien que le formatage est sorti impair)
Vous devez vous connecter pour publier un commentaire.
Si vous supprimez la Hauteur de votre Zone (qui, comme je le comprends, est-ce que vous voulez faire), alors il va remplir son récipient, sauf s'il y a un panneau en amont qui impose ses propres règles de dimensionnement.
J'ai utilisé cette version simplifiée de votre XAML. J'ai enlevé le modèle et la liaison, et codée en dur certains éléments, pour faire de ce stand alone; ces changements n'affectent pas la façon dont la mise en page est fait.
L'exécuter, et vous verrez que le contenu n'est en effet de taille pour s'adapter à la fenêtre, et la barre de défilement permet uniquement lorsque la fenêtre est trop petite pour voir tous les trois articles. Je crois que c'est ce que vous voulez.
Alors le problème est probablement l'un des panels de parents, vous n'êtes pas à montrer dans votre exemple XAML. Le problème que vous décrivez pourrait se produire si votre Zone apparaît à l'intérieur d'un StackPanel:
Maintenant la Zone de groupe s'affiche en haut de la Fenêtre, de la taille d'correspondre exactement à son contenu. Si vous réduisez la Fenêtre assez, la Zone sera coupée, parce que c'est dimensionné pour s'adapter à son contenu, pas de son contenant. Cela sonne comme le problème que vous décrivez.
La raison en est que StackPanel demande à ses enfants ce que leur hauteur idéale est (en fonction de leur contenu), et utilise cette hauteur. Sans StackPanel (ou quelque chose de similaire), la valeur par défaut est à l'égard du contrôle VerticalAlignment, et si c'est la valeur par défaut de l'Étirement, alors le contrôle est étirée pour remplir son parent. Cela signifie qu'il ne soit pas plus haut que son parent, qui sonne comme ce que vous voulez.
Solution: supprimer le StackPanel (ou tout autre chose qui vous cause des problèmes) et d'utiliser quelque chose d'autre. Selon ce que vous voulez accomplir, vous pourriez avoir plus de chance avec un DockPanel ou d'une Grille. Difficile à dire sans en savoir plus sur votre mise en page.
Edit: d'Accord, on dirait que le problème est en effet le
HeaderedContentControl
parent, mais pas directement. HeaderedContentControl n'est pas un panneau, afin de ne pas faire de mise en page de son propre (et son descendant, Zone, n'ont pas ce même problème). Le problème réside dans son modèle par défaut-qui comprend un StackPanel. La bonne nouvelle, c'est que vous êtes libre d'utiliser un modèle différent, disons avec un DockPanel à la place:Si vous laissez au large de la
<HeaderedContentControl.Style>
partie, cela permet de reproduire votre problème, mais avec le style en place, il permet à la Zone à remplir son récipient, de sorte que le ScrollViewer obtiendrez une barre de défilement lorsque vous le souhaitez.Si la réponse précédente ne résout pas le problème, vous pouvez également essayer de liaison de la Largeur, de la Hauteur de votre grille pour la ActualWidth, ActualHeight de votre parent UserControl. Quelque chose comme:
Dans ce cas, vous n'êtes pas un paramètre explicite de la largeur et de la hauteur, mais vous êtes en limitant les Grilles de la largeur/hauteur des contraintes de l'objet UserControl il est situé dans.
J'ai eu le même problème, après la lecture de cette réponse, j'ai remplacé toutes StackPanels avec des Grilles en UserControl. Il est résolu de la barre de Défilement question.
Ils sont différents. Si vous ne voulez pas avoir les éléments sélectionnables, puis ne pas utiliser une zone de liste. Il va être plus lourd, et auront également la désélection d'une sélection à chaque fois que l'utilisateur clique sur une entrée. Il suffit de mettre la ItemsControl dans un ScrollViewer
Essayez de retirer la grille entièrement et le réglage de la HorizontalAlignment et VerticalAlignment directement sur la Zone de groupe. Si un layoutpanel a qu'un seul enfant, c'est souvent redondant... ce migth être vrai dans votre cas.
Si cela ne fonctionne pas... ce qui est le parent de votre grille de contrôle?
Pourquoi ne pas simplement utiliser une zone de liste à la place d'un itemscontrol, qui a construit dans le scrollviewer.
J'ai eu le même problema avec ListBox, il n'était pas en expansion et le défilement de la visionneuse n'apparaît pas. Je l'ai résolu comme suit: