2010-10-15 8 views

Répondre

1

Cela dépend, vraiment, votre conception, et est une question de vos propres goûts. La plus grande chose est d'être cohérent.

Je pense qu'il est parfaitement acceptable de placer une colonne ou une rangée d'entretoise de largeur fixe dans la plupart des cas - alors vous n'avez pas à vous soucier de la maintenance plus tard (par vous ou quelqu'un d'autre). La chose à surveiller est de régler deux fois les choses (c'est-à-dire à la fois une colonne de marge et une largeur fixe). Ce n'est pas un gros problème si vous utilisez le même type de contrôle, mais il pourrait être un peu moche si vous utilisez différents types de contrôles auxquels des styles sont appliqués, tels que Margins et/ou Padding.

0

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; 
     } 
    } 
} 
+0

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. –

+0

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. –

+0

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.) –