WPF: Сетка с полем столбец / строка / отступы? - PullRequest
118 голосов
/ 24 августа 2009

Можно ли легко указать поле и / или отступ для строк или столбцов в сетке WPF?

Конечно, я мог бы добавить дополнительные столбцы для разметки, но это похоже на работу с отступами / полями (это даст намного более простой XAML). Кто-нибудь извлек из стандартной Grid эту функциональность?

Ответы [ 16 ]

1 голос
/ 05 декабря 2017

в uwp (версия Windows10FallCreatorsUpdate и выше)

<Grid RowSpacing="3" ColumnSpacing="3">
1 голос
/ 21 февраля 2017

Как было сказано ранее, создайте класс GridWithMargins. Вот мой пример рабочего кода

public class GridWithMargins : Grid
{
    public Thickness RowMargin { get; set; } = new Thickness(10, 10, 10, 10);
    protected override Size ArrangeOverride(Size arrangeSize)
    {
        var basesize = base.ArrangeOverride(arrangeSize);

        foreach (UIElement child in InternalChildren)
        {
            var pos = GetPosition(child);
            pos.X += RowMargin.Left;
            pos.Y += RowMargin.Top;

            var actual = child.RenderSize;
            actual.Width -= (RowMargin.Left + RowMargin.Right);
            actual.Height -= (RowMargin.Top + RowMargin.Bottom);
            var rec = new Rect(pos, actual);
            child.Arrange(rec);
        }
        return arrangeSize;
    }

    private Point GetPosition(Visual element)
    {
        var posTransForm = element.TransformToAncestor(this);
        var areaTransForm = posTransForm.Transform(new Point(0, 0));
        return areaTransForm;
    }
}

Использование:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:GridWithMargins ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Rectangle Fill="Red" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Green" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Blue" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </local:GridWithMargins>
    </Grid>
</Window>
1 голос
/ 23 марта 2011

Одной из возможностей может быть добавление строк и столбцов фиксированной ширины, которые будут выполнять функцию требуемого отступа / поля.

Вы также можете учитывать, что вы ограничены размером вашего контейнера и что сетка станет такой же большой, как содержащий элемент или его заданные ширина и высота. Вы можете просто использовать столбцы и строки без заданной ширины или высоты. Таким образом, они по умолчанию равномерно разбивают общее пространство в сетке. Тогда это будет просто вопрос центрирования ваших элементов по вертикали и горизонтали в вашей сетке.

Другой метод может заключаться в том, чтобы обернуть все элементы сетки в фиксированную сетку из одной строки и столбца, которая имеет фиксированный размер и поле. Что ваша сетка содержит фиксированные поля ширины / высоты, которые содержат ваши фактические элементы.

0 голосов
/ 18 января 2019

Чтобы задать поле для сетки, вы можете обернуть сетку рамкой, как это

<!--...-->
    <Border Padding="10">
            <Grid>
<!--...-->
0 голосов
/ 05 февраля 2017

Иногда простой метод самый лучший. Просто дополните свои строки пробелами. Если это всего лишь несколько текстовых полей и т. Д., То это самый простой способ.

Вы также можете просто вставить пустые столбцы / строки с фиксированным размером. Чрезвычайно просто, и вы можете легко изменить его.

0 голосов
/ 04 августа 2015

Хотя вы не можете добавить поле или отступ в Grid, вы можете использовать что-то вроде фрейма (или аналогичного контейнера), к которому вы можете применить его.

Таким образом (если вы показываете или скрываете элемент управления при нажатии кнопки, скажем), вам не нужно добавлять поля для каждого элемента управления, который может с ним взаимодействовать.

Думайте об этом как об изоляции групп элементов управления в единицах, а затем применении стиля к этим единицам.

...