1

3列のWPFグリッドを動的に作成する必要があり、行数は必要なパネルの数によって異なります。最初のパネルはグリッド位置0,0にあり、次のパネルは0,1-> 0,2-> 1,0-> 1,1などになります。したがって、20個のパネルが必要な場合、グリッドには3列と7行があります。 。そして、グリッドはウィンドウ全体を埋める必要があります

また、各パネルには見出しと進行状況バーが必要です。私は自分のパネルを別のユーザーコントロールとして持っていると思います

私はWPFから始めているので、どんな助けでも素晴らしいでしょう

どうもありがとう

4

2 に答える 2

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 プロパティなしで実行できます。また、グリッド セルをスキップすると、いくつかのバグが発生しますが、このコードを用途に合わせて調整できるはずです。

于 2012-07-25T17:24:48.040 に答える
0

次の例は、行数と列数を作成し、オブジェクト (この場合はラベル) を各セルに配置する方法を示しています。そこから推定できるかどうかを確認してください。

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 要素だけです。

于 2012-07-25T18:52:12.980 に答える