如何使用高度=自动访问元素的实际高度

时间:2009-07-03 14:28:39

标签: silverlight actualheight

我有这样的情况:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="560"/>
        <ColumnDefinition Width="250"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" /> <!-- status infos & content start -->
        <RowDefinition Height="Auto" /> <!-- status infos -->
        <RowDefinition Height="Auto" /> <!-- status infos -->
        <RowDefinition Height="Auto" /> <!-- status infos -->
        <RowDefinition Height="*"/>     <!-- content ends -->
    </Grid.RowDefinitions>

    <!-- image a list of custom controls directed to the first or second column on all rows here -->

    <SomeCustomControl Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Grid.RowSpan="2" />
</Grid>

正如您所看到的,我有2个列,正确的一个或多或少保留用于状态信息,左侧用于内容。 “SomeCustomControl”包含一个如此宽的控件,需要设置为ColumnSpan =“2”。请注意,右栏中仍有状态控件。在SomeCustomControl中我有这样的东西:

<Grid x:Name="LayoutRoot">

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="250"/>
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        [...]
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="*"  />   <!-- problem control here -->
        <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions>

    <!-- a list of Controls limited to the first column -->

    <ProblemControl Grid.Column="0" Grid.ColumnSpan="2" />
</Grid>

现在,SomeCustomControl的第一行包含仅限于第一列的控件,然后有一行包含我的ProblemControl。状态控件的高度不是预先确定的,取决于显示的状态信息。 SomeCustomControl中仅限于第一列的控件也具有不同的高度,这些高度当前通过内容自动确定。

我现在遇到的问题是ProblemControl与我的一些状态控件重叠。我尝试计算我的状态控件的高度和SomeCustomControl中的有限控件,但由于所有控件都是动态调整大小,我似乎无法获得正确的高度。 RowDefinitions的高度都包含Auto类型的高度和值1,具体控件的高度似乎是NaN。

关于如何以其他方式计算高度或防止重叠的任何想法。

3 个答案:

答案 0 :(得分:2)

我遇到了一些相同的问题,但最近遇到了解决方案。您无法访问宽度或高度设置为“自动”的控件的宽度和高度属性的原因是运行时系统在设置之前查询属性值。属性ActualWidthActualHeight声称获得控件的渲染高度,所以理论上,您认为您可以等到SL应用程序完成加载然后执行查询,因为控件会然后,应该设置ActualHeight / ActualWidth值。

可悲的是,事实并非如此。在设置这些值时似乎没有任何保证,因此我使用的解决方法是挂钩SizeChanged - 我想要的值的控件事件。只要控件的宽度和高度属性发生更改,就会触发SizeChanged,因此,如果我处理该事件,我保证将值设置为NaN以外的值。

在该事件的处理程序中执行您需要执行的任何逻辑,并且您将找到已设置的值。

答案 1 :(得分:1)

您是否尝试过控制ActualHeight属性?

答案 2 :(得分:0)

你应该能够通过正确使用Grid来解决这个问题,而某些小组(DockPanelStackPanel可能非常有用)。您可能还需要在某些控件上将HorizontalAlignmentVerticalAlignment属性设置为Stretch

您的示例中没有足够的内容供我们复制您的问题或知道我们已正确解决了问题。如果您需要更具体的帮助,请展开示例,以便我们运行它并查看您的问题。