7

我有一个网格。我必须手动定义每一列和每一行,如下所示:

<Window x:Class="GridBuild"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="GridBuild" Height="300" Width="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>        
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>        
</Grid>

我想用一行定义行数和列数,如下所示:

<Window x:Class="GridBuild"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="GridBuild" Height="300" Width="300">
    <Grid>
        <Grid.NumberOfRows="2"/>
        <Grid.NumberOfColumns/>
    </Grid>
</Window>
4

4 回答 4

9

你所描述的是所谓的UniformGrid。它具有ColumnsRows属性,您可以通过这些属性设置所需的行数或列数。

如果您不设置这些属性,UniformGrid则将尝试将子项布置得尽可能接近正方形。在这种情况下,它倾向于在增加行数之前增加列数。

这是一个不起眼的面板,但如果使用得当,它会非常强大。

于 2012-05-13T13:55:07.693 回答
4

我建议从这些属性派生Grid并添加到它,如下所示:

public class GridEx : Grid
{
    public int NumberOfRows
    {
        get { return RowDefinitions.Count; }
        set
        {
            RowDefinitions.Clear();
            for (int i = 0; i < value; i++)
                RowDefinitions.Add(new RowDefinition());
        }
    }

    public int NumberOfColumns
    {
        get { return ColumnDefinitions.Count; }
        set
        {
            ColumnDefinitions.Clear();
            for (int i = 0; i < value; i++)
                ColumnDefinitions.Add(new ColumnDefinition());
        }
    }
}

现在可以按如下方式使用:

<local:GridEx NumberOfRows="3" NumberOfColumns="2">
    <TextBox>some text</TextBox>
    <TextBox Grid.Row="1">some text</TextBox>
    <TextBox Grid.Row="2">some text</TextBox>

    <TextBox Grid.Column="1">some text</TextBox>
    <TextBox Grid.Row="1" Grid.Column="1">some text</TextBox>
    <TextBox Grid.Row="2" Grid.Column="1">some text</TextBox>
</local:GridEx>

顺便说一句,也可以在设计师中工作:)

这里的挑战是为不同的行和列设置不同的宽度、高度等。我有一个很好的想法如何做到这一点。也可以自动分配 Grid.Row 和 Grid.Column。想想看:)

于 2012-05-13T09:23:22.370 回答
3

EvAlex 的上述答案将起作用,但前提是您不想使用数据绑定设置列/行数。

public class GridEx : Grid
{
    public int NumberOfRows
    {
        get { return RowDefinitions.Count; }
        set
        {
            RowDefinitions.Clear();
            for (int i = 0; i < value; i++)
                RowDefinitions.Add(new RowDefinition());
        }
    }

    public int NumberOfColumns
    {
        get { return ColumnDefinitions.Count; }
        set
        {
            ColumnDefinitions.Clear();
            for (int i = 0; i < value; i++)
                ColumnDefinitions.Add(new ColumnDefinition());
        }
    }
}

如果您确实想通过数据绑定来设置这些(就像我一样),那么使用上述解决方案,编译器会抱怨,因为它需要这样做DependencyProperties。ADependencyProperty可以如下实现(使用 C# 6 的nameof运算符)(插入它的快速方法是使用片段 propdp):

public int Columns
{
    get { return (int) GetValue(ColumnsDependencyProperty); }
    set { SetValue(ColumnsDependencyProperty, value); }
}
public static readonly DependencyProperty ColumnsDependencyProperty =
    DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0));

但是这样你就不能执行必要的逻辑来添加必要数量的RowDefinitions. 为了解决这个问题,DependencyPropertyDescriptor为每个定义一个DependencyProperty并在您的自定义类的构造函数中添加一个AddValueChanged带有必要逻辑的调用。然后每个属性的结果是(使用 C# 6 的空条件运算符?.):

    public int Columns
    {
        get { return (int) GetValue(ColumnsDependencyProperty); }
        set { SetValue(ColumnsDependencyProperty, value); }
    }
    public static readonly DependencyProperty ColumnsDependencyProperty =
        DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0));

    DependencyPropertyDescriptor ColumnsPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ColumnsDependencyProperty, typeof(GridEx));

    public GridEx()
    {
        ColumnsPropertyDescriptor?.AddValueChanged(this, delegate
        {
            ColumnDefinitions.Clear();
            for (int i = 0; i < Columns; i++)
                ColumnDefinitions.Add(new ColumnDefinition());
        });
    }
于 2016-11-24T17:59:42.140 回答
1

在这里寻找一个完全符合您要求的助手: https ://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/

如果您已将上述链接中的帮助程序添加到您的项目中,您可以像这样使用它:

<Grid local:GridHelpers.RowCount="6"
      local:GridHelpers.StarRows="5"
      local:GridHelpers.ColumnCount="4"
      local:GridHelpers.StarColumns="1,3">
</Grid>
于 2015-06-05T10:04:24.150 回答