2011-01-25 41 views
1

我正在创建一个创建项目并将其动态添加到WPF画布的拖放编辑器。对于每个项目,它都会创建一个动态网格并将其添加到画布。我需要添加有关这些网格中每个网格的布局状态信息,以便我知道它在画布上的坐标。我遇到的问题是,当我尝试访问我添加的每个网格的Height/ActualHeight/RenderedSize信息时,它总是变为0.我假设我可能需要渲染项目,以便新的状态信息已注册,但我不太确定如何执行此操作。我通过提供的InvalidateXXXX()方法看到了支持,但我不确定是否应该使用哪一个。还有一个UpdateLayout()函数,但我不确定这是否是我需要的。WPF中的动态网格测量 - 渲染控件

这里是我通过一个循环运行的代码,并添加表示Canvas中的LineItems的Grids。

   /*Initialize Grid Layout*/ 
       Grid newGrid = new Grid(); 
       newGrid.MinHeight = 50; 
       newGrid.Width = PreviewWindow.ActualWidth; 
       newGrid.Background = Brushes.Beige; 
       newGrid.ShowGridLines = true; 

       /*Define Column Definitions*/ 
       List<ColumnDefinition> columns = new List<ColumnDefinition>(fieldItemList.Count); 
       foreach (ColumnDefinition column in columns) 
       { 
        ColumnDefinition labelColumn = new ColumnDefinition(); 
        newGrid.ColumnDefinitions.Add(labelColumn); 
        newGrid.ColumnDefinitions.Add(column); 
       } 

       /*Define Row Definitions*/ 
       RowDefinition row = new RowDefinition(); 
       newGrid.RowDefinitions.Add(row); 

       int colCount = 0; 
       for (int i = 0; i < fieldItemList.Count; i++) 
       { 
        FieldItem fieldItem = fieldItemList[i]; 

        /*Initialize Example Label*/ 
        Label label = new Label(); 
        label.Content = fieldItem.Label; 
        Grid.SetRow(label, 0); 
        Grid.SetColumn(label, colCount); 
        newGrid.Children.Add(label); 

        /*Initialize Example Text Box*/ 
        TextBox textBox = new TextBox(); 
        Grid.SetRow(textBox, 0); 
        Grid.SetColumn(textBox, colCount + 1); 
        newGrid.Children.Add(textBox); 
        colCount++; 
       } 

       stackPanel.Children.Add(newGrid); 

       //I need to Access the Height of each of the grids here somehow 
       lastTop += (int)newGrid.ActualHeight ; 
       newGrid.InvalidateMeasure(); 
       //Or InvalidateVisual(), or do I perform this on something else? 

      } 

有参照一个StackPanel,所有这些网格的被添加到堆栈面板,并且他们将eventuall由坐标(我目前不能抢)被布置。现在的问题是它将所有这些项目添加到列表中,需要按顶部坐标进行排序,但由于顶部坐标为0,因此无法正确排序。

回答

1

的几个注意事项:

  1. 的StackPanel中不提供尺寸布局的建议,它的孩子,所以电网将需要提供它自己的布局尺寸。为了达到此目的,您需要将行和列的大小设置为“自动”,以便它们扩展以适应其内容。即使那样,我也不完全确定它是否可行(通常您将Auto与“*”行或列组合在一起,而不是将所有自动列都放在一起,让它们展开为固定或拉伸的整个网格大小)。这里提出的行为会有点奇怪,因为它会根据列文本框的内容动态调整列的大小;例如,如果您在任何一行中都没有文字,您将得到零宽度文本框,只有边距和边框可以提供任意大小。

  2. 一旦StackPanel添加了子项,就需要在StackPanel上调用UpdateLayout。这将导致它计算每个孩子的布局信息,然后适当地定位它们。如果您不断动态添加网格,这可能会变得非常昂贵,因此需要公平警告。