Est-il facilement possible de spécifier une marge et / ou un remplissage pour les lignes ou les colonnes d'une grille WPF?
Je pourrais bien sûr ajouter des colonnes supplémentaires pour espacer les choses, mais cela semble être un travail pour le remplissage / les marges (cela donnera du XAML beaucoup plus simple). Quelqu'un a-t-il dérivé de la grille standard pour ajouter cette fonctionnalité?
Réponses:
Vous pouvez écrire votre propre
GridWithMargin
classe, héritée deGrid
, et remplacer laArrangeOverride
méthode pour appliquer les margesla source
RowDefinition
etColumnDefinition
sont de typeContentElement
, etMargin
est strictement uneFrameworkElement
propriété. Donc, à votre question, «est-ce facilement possible», la réponse est un non des plus catégoriques. Et non, je n'ai vu aucun panneau de mise en page qui démontre ce type de fonctionnalité.Vous pouvez ajouter des lignes ou des colonnes supplémentaires comme vous l'avez suggéré. Mais vous pouvez également définir des marges sur un
Grid
élément lui-même, ou tout ce qui pourrait entrer dans unGrid
, c'est donc votre meilleure solution de contournement pour le moment.la source
Utilisez un
Border
contrôle en dehors du contrôle de cellule et définissez le remplissage pour cela:La source:
la source
Vous pouvez utiliser quelque chose comme ceci:
Ou si vous n'avez pas besoin des TemplateBindings:
la source
J'ai pensé que j'ajouterais ma propre solution parce que personne n'a encore mentionné cela. Au lieu de concevoir un UserControl basé sur Grid, vous pouvez cibler les contrôles contenus dans la grille avec une déclaration de style. Prend soin d'ajouter padding / margin à tous les éléments sans avoir à définir pour chacun, ce qui est lourd et laborieux.Par exemple, si votre Grid ne contient rien d'autre que des TextBlocks, vous pouvez le faire:
Ce qui est comme l'équivalent du «remplissage de cellules».
la source
Margin
propriété, c'est que n'importe lequelStyle
dans unResourceDictionary
s'appliquera à chaque élément de sonTargetType
partout dans la portée entière de l'élément propriétaire de ce dictionnaire. C'est donc çaStyle
qui coule, pas la propriété.Ce n'est pas terriblement difficile. Je ne peux pas dire à quel point c'était difficile en 2009 lorsque la question a été posée, mais c'était alors.
Notez que si vous définissez explicitement une marge directement sur un enfant de la grille lors de l'utilisation de cette solution, cette marge apparaîtra dans le concepteur mais pas au moment de l'exécution.
Cette propriété peut être appliquée à Grid, StackPanel, WrapPanel, UniformGrid ou tout autre descendant de Panel. Cela affecte les enfants immédiats. Il est présumé que les enfants voudront gérer la mise en page de leur propre contenu.
PanelExt.cs
Démo:
MainWindow.xaml
MainWindow.xaml.cs
la source
build
ourun
avant que l'aperçu en direct puisse être affiché? Bon et simple. 1 vers le haut.J'ai récemment rencontré ce problème en développant un logiciel et il m'est venu à l'idée de demander POURQUOI? Pourquoi ont-ils fait ça ... la réponse était juste là devant moi. Une ligne de données est un objet, donc si nous conservons l'orientation de l'objet, la conception d'une ligne particulière doit être séparée (supposons que vous deviez réutiliser l'affichage de la ligne plus tard dans le futur). J'ai donc commencé à utiliser des panneaux de pile de données et des contrôles personnalisés pour la plupart des affichages de données. Les listes ont fait des apparitions occasionnelles, mais la grille a surtout été utilisée uniquement pour l'organisation de la page principale (en-tête, zone de menu, zone de contenu, autres zones). Vos objets personnalisés peuvent facilement gérer les exigences d'espacement pour chaque ligne dans le panneau de pile ou la grille (une seule cellule de grille peut contenir la totalité de l'objet de ligne. Cela présente également l'avantage supplémentaire de réagir correctement aux changements d'orientation,
ou
Vos contrôles personnalisés hériteront également du DataContext si vous utilisez la liaison de données ... mon avantage personnel préféré de cette approche.
la source
ListView
contrôle WPF enGridView
mode, mais sans aucune disposition pour que tous les «RowObjects» partagent la même largeur de colonne. En réalité, cela n'a plus grand chose à voir avec une grille.dans uwp (version Windows10FallCreatorsUpdate et supérieure)
la source
Xamarin.Forms
.Édité:
Pour donner une marge à n'importe quel contrôle, vous pouvez envelopper le contrôle avec une bordure comme celle-ci
la source
Je l'ai fait maintenant avec l'une de mes grilles.
la source
Une possibilité serait d'ajouter des lignes et des colonnes de largeur fixe pour agir comme le remplissage / marge que vous recherchez.
Vous pouvez également considérer que vous êtes contraint par la taille de votre conteneur et qu'une grille deviendra aussi grande que l'élément conteneur ou sa largeur et sa hauteur spécifiées. Vous pouvez simplement utiliser des colonnes et des lignes sans largeur ni hauteur. De cette façon, ils divisent par défaut de manière égale l'espace total dans la grille. Ensuite, il s'agirait simplement de centrer vos éléments verticalement et horizontalement dans votre grille.
Une autre méthode pourrait consister à envelopper tous les éléments de la grille dans une grille fixe avec une seule ligne et colonne qui a une taille et une marge fixes. Que votre grille contient des cases de largeur / hauteur fixes qui contiennent vos éléments réels.
la source
J'ai eu un problème similaire récemment dans la grille à deux colonnes, j'avais besoin d'une marge sur les éléments de la colonne de droite uniquement. Tous les éléments des deux colonnes étaient de type TextBlock.
la source
Bien que vous ne puissiez pas ajouter de marge ou de remplissage à une grille, vous pouvez utiliser quelque chose comme un cadre (ou un conteneur similaire), auquel vous pouvez l'appliquer.
De cette façon (si vous affichez ou masquez le contrôle lors d'un clic sur un bouton, par exemple), vous n'aurez pas besoin d'ajouter de marge sur chaque contrôle susceptible d'interagir avec lui.
Pensez-y comme isoler les groupes de contrôles en unités, puis appliquer un style à ces unités.
la source
Comme indiqué précédemment, créez une classe GridWithMargins. Voici mon exemple de code de travail
Usage:
la source
Je suis surpris de ne pas avoir encore vu cette solution publiée.
Venant du Web, les frameworks comme bootstrap utiliseront une marge négative pour retirer les lignes / colonnes.
Cela peut être un peu verbeux (mais pas si mal), cela fonctionne et les éléments sont uniformément espacés et dimensionnés.
Dans l'exemple ci-dessous, j'utilise une
StackPanel
racine pour montrer comment les 3 boutons sont régulièrement espacés en utilisant des marges. Vous pouvez utiliser d'autres éléments, il suffit de changer le x: Type interne du bouton à votre élément.L'idée est simple, utilisez une grille à l'extérieur pour extraire les marges des éléments de leurs limites de moitié par rapport à la grille intérieure (en utilisant des marges négatives), utilisez la grille intérieure pour espacer uniformément les éléments avec le montant souhaité.
Mise à jour: un commentaire d'un utilisateur dit que cela ne fonctionne pas, voici une rapide vidéo de démonstration: https://youtu.be/rPx2OdtSOYI
la source
Parfois, la méthode simple est la meilleure. Remplissez simplement vos chaînes d'espaces. S'il ne s'agit que de quelques zones de texte, etc., c'est de loin la méthode la plus simple.
Vous pouvez également simplement insérer des colonnes / lignes vides avec une taille fixe. Extrêmement simple et vous pouvez facilement le changer.
la source