2012-08-30 54 views
2

我试图以编程方式获取网格的宽度和高度,在UserControl中。以编程方式获取当前列宽和高度?

这里是我的XAML格:

<Grid Name="BallGrid" Background="DarkBlue" Height="auto" Width="auto"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
</Grid> 

但是这两种:

double width = BallGrid.ColumnDefinitions[0].ActualWidth; 
double height = BallGrid.RowDefinitions[0].ActualHeight; 

返回0,

这些

double width = BallGrid.ColumnDefinitions[0].Width.Value; 
double height = BallGrid.RowDefinitions[0].Height.Value; 

收益都返回1。

我想知道实际宽度,最好以与边距尺寸相同的单位。我如何以编程方式获取这些值?

在ProgessChanged方法中查询列值,该方法每50毫秒由BackgroundWorker调用一次,这可能会有所不同。

+0

是否在控件提交后查询这些属性? – Dennis

+0

他们从ProgressChanged方法调用,我不知道它是否已被渲染,可能不是由外观的东西... – ProgrammerAtWork

回答

4

通常你用ActualWidth/Height,这里的属性是有点懒:

当您添加或删除的行或列中,ActualWidth所有ColumnDefinition元素和的ActualHeight所有RowDefinition元素变直到调用Measure为止。

因此,您可以手动拨打Measure或尝试等待它。

0

尝试BallGrid.RenderSize.HeightBallGrid.RenderSize.Width

+0

两者仍然返回0. – ProgrammerAtWork

+0

那么这可能意味着你的网格还没有渲染。如果你仍然想要大小,那么你可以尝试'BallGrid.DesiredSize.Height'和'BallGrid.DesiredSize.Width',但这可能不是它所呈现的大小。 –

1

它们是有效的来源已经初始化之后。您可以覆盖OnSourceInitialized以了解何时发生。

+0

我在哪里可以找到OnSourceInitialized方法? OnInitalized给出了相同的结果。 – ProgrammerAtWork

+0

我试过OnInitialized第一次,它没有为我工作。键入'覆盖'(覆盖加空格),智能感知会提示你想要覆盖的方法,选择它并且智能感知将添加整个方法,主体和基地调用。得爱Intellisense! – Tergiver

+0

没有OnSourceInitialised,或者至少,我的智能感知没有找到它。 – ProgrammerAtWork

相关问题