Je veux un moyen logique et simple de produire une mise en page avec un poste de contrôle pour remplir et le reste à la quai. Je pourrais utiliser: mais ce n'est pas très intuitif à utiliser. Je pourrais aussi le faire comme ceci: p> mais c'est aussi beaucoup beaucoup de xaml. Ce que je veux vraiment, c'est quelque chose comme ceci: p> Comment cela pourrait-il être obtenu sans avoir à inverser les éléments comme avec DockPanel et à ne pas utiliser de nombre fixe de lignes et de propriétés connectées Comme avec la grille? p> p>
3 Réponses :
Vous pouvez toujours écrire votre propre panneau avec différentes règles d'accueil. Vous pouvez utiliser la mise en œuvre standard de DockPanel (disponible dans la source-cadre - elle n'a pas l'air très compliquée) et crée quelque chose de similaire avec des règles que vous préférez. Vous pourriez même être capable de créer une classe qui dérive de DockPanel et du remplacement de l'aiguoverride.
Mais personnellement, je voudrais simplement utiliser le panneau de quai, ce qui fait exactement ce que vous voulez, sauf que vous n'aimez pas ses règles à quel point membre obtient Soyez le remplissage. p>
IME Grid a un problème d'entretien horrible si vous insérez / supprimez des lignes, vous vous trouvez en ce que vous vous trouvez en train de régler sans fin nombre de lignes - DockPanel est beaucoup plus facile à cet égard. P>
Mise à jour: P>
Vous allez, je vous ai refusé le plaisir de le faire vous-même - il s'agit simplement de la version coupée / inversée de la source-cadre: p>
public class BottomDockingPanel : DockPanel { protected override Size ArrangeOverride(Size arrangeSize) { UIElementCollection children = InternalChildren; int totalChildrenCount = children.Count; double accumulatedBottom = 0; for (int i = totalChildrenCount-1; i >=0 ; --i) { UIElement child = children[i]; if (child == null) { continue; } Size childDesiredSize = child.DesiredSize; Rect rcChild = new Rect( 0, 0, Math.Max(0.0, arrangeSize.Width - (0 + (double)0)), Math.Max(0.0, arrangeSize.Height - (0 + accumulatedBottom))); if (i > 0) { accumulatedBottom += childDesiredSize.Height; rcChild.Y = Math.Max(0.0, arrangeSize.Height - accumulatedBottom); rcChild.Height = childDesiredSize.Height; } child.Arrange(rcChild); } return (arrangeSize); } }
Il n'y a pas de panneau de ce type dans WPF qui l'appuierait hors de la boîte. Si vous voulez ce comportement particulier, vous pouvez créer votre propre panneau, mais je ne vous conseillerais pas de le faire, car il est assez coutume et ne nécessitait pas que si vous voulez un panneau qui aurait un comportement comme Middlechildfill? votre propre panneau pour cette affaire aussi?). p>
Généralement, ce type de mise en page est atteint en utilisant grille code> (comme vous l'avez mentionné). Oui, ceci est vrai que
grille code> a une syntaxe très verbeuse (vous pouvez le simplifier à l'aide d'un assistant comme Ce ), mais cela vous donne la plus grande flexibilité. Et à la fin de la journée, c'est ce qui compte. P>
J'utilise ce modèle de mise en page assez souvent. Un stackpanel avec une option pour remplir le dernier ou le premier enfant serait très utile, je pense.
@Andreas Zita - C'est votre choix, je partage juste mon expérience :)
Vous pouvez utiliser un DockPanel avec un StackPanel à l'intérieur. Le contenu "principal" serait montré en dernier au lieu de la première fois, mais au moins la teneur en bas serait affichée dans un ordre logique de votre XAML. Si vous êtes prêt à faire durer le contenu rempli, ce serait le moyen le plus simple d'aller.
<Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Button Grid.Row="0" Content="Main" /> <StackPanel Grid.Row="1"> <Button Content="Bottom 1" /> <Button Content="Bottom 2" /> <Button Content="Bottom 3" /> </StackPanel> </Grid>
Le problème avec mon cas spécifique est que je veux produire cette mise en page avec un modèle sur des objetsContainer et je suppose qu'il n'y a aucun moyen de fractionnement des articles à l'autre dans un "principal" et "le reste" -Enumérable. Si c'était possible, je pouvais faire comme ça ...
Vous pouvez toujours avoir votre viewModel expose deux propriétés: une pour le premier enfant (que vous souhaitez remplir l'espace) et pour les articles restants. Ensuite, vous pouvez utiliser un contentControl pour le premier, et un articleControl pour le reste. Pas totalement élégant, mais un peu plus simple que d'écrire votre propre panneau.