Si vous ne me dérange pas de tirer la grille de votre propre contrôle et à l'aide qu'au lieu, vous pouvez le faire assez facilement. Comme il semble être une bonne idée que je fouetté rapidement ce code (la plupart du temps non testé et assez laid!):
/// <summary>
/// Enhanced Grid that can automatically apply a padding to all its children.
/// </summary>
public class PaddedGrid : Grid
{
/// <summary>
/// Gets or sets a padding value to apply as the margin to all children.
/// If left to default (null or 'zero' Thickness) the margins of the children are not modified.
/// </summary>
public Thickness? Padding
{
get { return (Thickness?)GetValue(PaddingProperty); }
set { SetValue(PaddingProperty, value); }
}
public static readonly DependencyProperty PaddingProperty =
DependencyProperty.Register("Padding", typeof(Thickness?), typeof(PaddedGrid), new PropertyMetadata(PaddingChanged));
private bool HasPadding()
{
return Padding.HasValue && Padding.Value != default(Thickness);
}
private static void PaddingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var g = d as PaddedGrid;
if (g != null)
{
if (!g.HasPadding()) return;
for (int i = 0; i < g.VisualChildrenCount; i++)
{
var v = g.GetVisualChild(i);
var c = v as FrameworkElement;
if (c == null || c is GridSplitter) continue;
c.Margin = (Thickness)e.NewValue;
}
}
}
protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
{
base.OnVisualChildrenChanged(visualAdded, visualRemoved);
if (!HasPadding()) return;
if (visualAdded != null)
{
var fe = visualAdded as FrameworkElement;
if (fe != null) fe.Margin = this.Padding.Value;
}
}
}
Merci pour votre réponse, la chose est que je ne veux pas que la marge soit automatique mais pour avoir le contrôle sur les colonnes et les lignes auxquelles elle devrait s'appliquer. –
Eh bien, vous pouvez toujours l'étendre à votre goût. Par exemple, vous pouvez accepter des valeurs séparées pour les lignes et les colonnes en tant que chaînes, et dans les chaînes, vous pouvez mettre des valeurs séparées par des virgules qui représentent les marges. Toutefois, comme les lignes et les colonnes de la grille ne sont pas des enfants, vous devez déterminer sur quelle ligne et quelle colonne un visuel enfant est positionné (en utilisant les propriétés attachées Grid.Row et Grid.Column). Le ciel est la limite, mais bien sûr, cela n'a pas beaucoup de sens de créer votre propre cadre d'alignement de mini-grille, sauf si vous allez vraiment l'utiliser dans un lot d'endroits. –
Je suis tout à fait d'accord avec votre dernière affirmation: "bien sûr, cela n'a pas beaucoup de sens de créer votre propre cadre d'alignement de mini-grille, sauf si vous allez vraiment l'utiliser dans beaucoup d'endroits." Cette solution, bien qu'elle puisse avoir sa place, est beaucoup plus complexe que la plupart des solutions, ce qui peut la rendre plus difficile à maintenir (surtout quand vous commencez à ajouter des paramètres analysables, etc.) –