获取实际的WPF网格宽度

时间:2011-05-04 03:40:32

标签: wpf grid width stackpanel

我有一个带网格的WPF窗口:

<Grid Name="mainGrid">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="20*" />
    <ColumnDefinition Width="700*" />
    <ColumnDefinition Width="190*" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="80" />
    <RowDefinition Height="220*" />
    <RowDefinition Height="450*" />
    <RowDefinition Height="160*" />
    <RowDefinition Height="30" />
  </Grid.RowDefinitions>
</Grid>

在代码隐藏中,我在第一列,第二行mainGrid中添加了一个stackpanel,但我希望stackpanel的最大宽度为第1列的宽度 - 50px。我偶然发现了stkPanel.Width = mainGrid.ColumnDefinitions(1).Width.ToString - 50,但这会导致错误:

  

700 *无法转换为双倍

有没有办法获得网格列的实际宽度,因为它显示在屏幕上以使用我想要的方式,或者我是否设置填充或类似?

谢谢,

马特

4 个答案:

答案 0 :(得分:5)

Grid有两个属性:

Grid g = new Grid();
double width1 = g.ActualWidth;
double width2 = g.RenderSize.Width;

这两个应该成功,试试吧

答案 1 :(得分:3)

原来我几乎就在那里。而不是使用

  

stkPanel.Width = mainGrid.ColumnDefinitions [1] .Width.ToString - 50

我应该用

  

stkPanel.Width = mainGrid.ColumnDefinitions [1] .ActualWidth.ToString - 50

答案 2 :(得分:3)

虽然自己行和列大小算法可以工作,但你应该知道这种方法存在缺陷。当您的数据更改或调整窗口大小时,网格的布局将会更新,一切都可以更改。当然,你可以适应这些变化,但这是更多的工作。

相反,如果可以,您可以尝试使用额外的列和列跨度来完成网格本身的所有操作。然后网格将处理所有肮脏的工作,你可以专注于外观。

答案 3 :(得分:0)

您必须使用ActualWidth和ActualHeight。 例如:

stkPanel.Width = mainGrid.ColumnDefinitions[1].ActualWidth - 50;