Лучший способ реализовать поле между столбцами / строками сетки WPF / SL - PullRequest
2 голосов
/ 15 октября 2010

Какой лучший способ добавить поле между столбцами или строками в сетке WPF или Silverlight?

  1. Добавление столбцов / строк фиксированной ширины / высоты в сетку
  2. Добавление поля в сетку дочерних элементов управления
  3. Что-нибудь еще?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Это действительно зависит от вашего дизайна и зависит от ваших собственных вкусов.Самое главное - быть последовательным.

Я думаю, что в большинстве случаев вполне приемлемо ставить столбец или строку «распорки» фиксированной ширины - тогда вам не придется беспокоиться об обслуживании позже (ни вам, никто-то еще).

Следует обращать внимание на то, что необходимо установить параметры дважды (т. е. столбец поля и фиксированная ширина).Это не слишком большая проблема, если вы используете все те же виды элементов управления, но это может стать немного уродливым, если вы используете различные типы элементов управления, к которым применены стили, в том числе поля и / или отступы.

0 голосов
/ 15 октября 2010

Если вы не возражаете извлечь свой собственный контроль из Grid и использовать его вместо этого, вы можете сделать это довольно легко. Поскольку это кажется хорошей идеей, я быстро собрал этот (в основном непроверенный и довольно уродливый!) Код:

/// <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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...