[英]wpf - measuring the actual width and actual height
我在XAML中定義了一個Grid,就像
<Grid Name="myGrid" Grid.Row="0" Grid.Column="0">
<!-- row/column definitions are defined in c# file -->
</Grid>
這也是xaml文件中其他定義網格的一部分。
在構造函數的C#文件中,在行InitializeComponent()
我已經為行和列定義了網格定義
public State1() {
InitializeComponent();
// define the rows
for (int i = 0; i < 5; i++) {
RowDefinition rowDef = new RowDefinition();
rowDef.Height = new GridLength(1, GridUnitType.Star);
myGrid.RowDefinitions.Add(rowDef);
}
// define the columns
// column for Line
ColumnDefinition colDef1 = new ColumnDefinition();
colDef1.Width = new GridLength(8, GridUnitType.Star);
myGrid.ColumnDefinitions.Add(colDef1);
// column for TextBlock
ColumnDefinition colDef2 = new ColumnDefinition();
colDef2.Width = new GridLength(1, GridUnitType.Star);
myGrid.ColumnDefinitions.Add(colDef2);
for (int i = 0; i < 5; i++) {
// draw dashed line
Line line= new Line() {
X2 = myGrid.ColumnDefinitions[0].ActualWidth, // actual width is 0
Stroke = Brushes.Black,
StrokeDashArray = {10, 10, 10, 10},
StrokeThickness = 1
};
Grid.SetRow(line, i);
Grid.SetColumn(line, 0);
myGrid.Children.Add(line);
// draw text
Viewbox vb_txtBlock = new Viewbox();
TextBlock txtBlock = new TextBlock();
txtBlock.Text = "Line " + (i+1);
vb_txtBlock.Child = txtBlock;
Grid.SetRow(vb_txtBlock, i);
Grid.SetColumn(vb_txtBlock, 1);
myGrid.Children.Add(vb_txtBlock);
}
}
所以,我的問題是myGrid.ColumnDefinitions[0].ActualWidth
返回0值。 我已經閱讀了其他問題和問題,並且我發現在測量和排列控件之前,不會設置ActualHeight和ActualWidth。
我的問題是,在我的c#代碼中,我可以測量實際的寬度和高度,以便我可以使用實際寬度和高度?
您應該將初始化代碼放在InitializeComponent
之后並在Loaded
事件中獲取測量值,如下所示:
public Window2()
{
InitializeComponent();
for (int i = 0; i < 5; i++)
{
RowDefinition rowDef = new RowDefinition();
rowDef.Height = new GridLength(1, GridUnitType.Star);
myGrid.RowDefinitions.Add(rowDef);
}
// define the columns
// column for Line
ColumnDefinition colDef1 = new ColumnDefinition();
colDef1.Width = new GridLength(8, GridUnitType.Star);
myGrid.ColumnDefinitions.Add(colDef1);
// column for TextBlock
ColumnDefinition colDef2 = new ColumnDefinition();
colDef2.Width = new GridLength(1, GridUnitType.Star);
myGrid.ColumnDefinitions.Add(colDef2);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 5; i++)
{
// draw dashed line
Line line = new Line()
{
X2 = myGrid.ColumnDefinitions[0].ActualWidth, // actual width is 0
Stroke = Brushes.Black,
StrokeDashArray = { 10, 10, 10, 10 },
StrokeThickness = 1
};
Grid.SetRow(line, i);
Grid.SetColumn(line, 0);
myGrid.Children.Add(line);
// draw text
Viewbox vb_txtBlock = new Viewbox();
TextBlock txtBlock = new TextBlock();
txtBlock.Text = "Line " + (i + 1);
vb_txtBlock.Child = txtBlock;
Grid.SetRow(vb_txtBlock, i);
Grid.SetColumn(vb_txtBlock, 1);
myGrid.Children.Add(vb_txtBlock);
}
}
調試時我得到一個有效的ActualWidth
。
您可以在重寫方法OnRenderSizeChanged()中添加您的代碼,如下所示
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
////Here put your code.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.