如何创建包含面板的动态网格

时间:2012-07-25 17:00:59

标签: c# .net wpf

我需要动态创建一个包含3列的WPF网格,行数取决于我需要的面板数量。第一个面板将位于网格位置0,0,下一个面板位于0,1 - > 0,2 - > 1,0 - >等等。所以如果我需要20个面板,网格将有3个cols和7个行。网格应该填满整个窗口

每个小组都应该有一个标题和一个进度条。我想我会把我的面板作为一个单独的用户控件

我开始使用WPF,所以任何帮助都会很棒

非常感谢

2 个答案:

答案 0 :(得分:1)

据我所知,你必须在代码隐藏方面做到这一点。

您只需将所需的单元格除以3并向上舍入。

从网格中导出控件。 为单元格编号创建自定义附加属性。 然后覆盖MeasureOverride,并通过向上舍入的行计数设置网格行定义。然后在每个项目上设置grid.row和grid.column,以对应于从控件中读取的单元格编号。

然后调用默认的grid.measureoverride。

public class ArrangeGrid : Grid
{
    public ArrangeGrid()
    {
        ColumnDefinitions.Add(new ColumnDefinition());
        ColumnDefinitions.Add(new ColumnDefinition());
        ColumnDefinitions.Add(new ColumnDefinition());
    }
    public static DependencyProperty GridCellProperty = DependencyProperty.RegisterAttached("GridCell", typeof(int), typeof(ArrangeGrid));

    public static void SetGridCell(UIElement element, int value)
    {
        element.SetValue(ArrangeGrid.GridCellProperty, value);
    }

    [AttachedPropertyBrowsableForChildren]
    public static int GetGridCell(UIElement element)
    {
        return (int)element.GetValue(ArrangeGrid.GridCellProperty);
    }

    protected override Size MeasureOverride(Size constraint)
    {
        RowDefinitions.Clear();

        int rowCount = this.Children.Count / 3;
        if (this.Children.Count % 3 != 0)
        {
            rowCount += 1;
        }

        while (RowDefinitions.Count < rowCount)
        {
            RowDefinitions.Add(new RowDefinition());
        }

        foreach (var child in this.Children)
        {

            int gridCell = ArrangeGrid.GetGridCell((UIElement)child);
            int gridRow = gridCell / 3;
            int gridCol = gridCell % 3;

            ((UIElement)child).SetValue(Grid.RowProperty, gridRow);
            ((UIElement)child).SetValue(Grid.ColumnProperty, gridCol);

        }

        return base.MeasureOverride(constraint);
    }
}

显然你可以在没有GridCell属性的情况下做到这一点。如果你跳过网格单元格,那里有一些错误,但是你应该能够根据你的需要调整这些代码。

答案 1 :(得分:0)

以下示例显示如何创建行数和列数,并将对象(在本例中为Label)放入每个单元格中。看看你是否可以从那里进行推断。

public partial class MainWindow : Window
{
    Grid grid1;
    public MainWindow()
    {
        InitializeComponent();

        int cellCount = 14;
        int numCols = 3;
        int numRows = (cellCount + 1) / numCols;
        grid1 = new Grid();

        this.AddChild(grid1);

        for(int i=0; i<numCols; ++i)
            this.grid1.ColumnDefinitions.Add(new ColumnDefinition());
        for (int i = 0; i < numRows; ++i)
            this.grid1.RowDefinitions.Add(new RowDefinition());

        foreach (var g in this.grid1.RowDefinitions)
        {
            g.Height = new GridLength(100);
        }

        foreach (var g in grid1.ColumnDefinitions)
        {
            g.Width = new GridLength(100);
        }

        for(int i=0; i<cellCount; ++i)
        {
            int idx = grid1.Children.Add(new Label());
            Label x = grid1.Children[idx] as Label;

            x.Content = "Cell " + i;
            x.SetValue(Grid.RowProperty, i/numCols);
            x.SetValue(Grid.ColumnProperty, i % numCols);
        }
    }
}

此示例以几乎完全空的XAML开头。它只有Window元素。