我正在创建一个创建项目并将其动态添加到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,因此无法正确排序。