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

问题描述:

我有这样的情况:如何访问与高度元素的实际高度=自动

<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。

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

您是否尝试过使用ActualHeight属性进行控制?

+0

由于控件只是可见的,所以这个值似乎包含“旧”值(0表示元素只是可见的,一些值取决于现在改变的状态信息)。 嗯,也许我可以找到一些事件,把计算在控制可见后触发。 Thx为ActualHeight无论如何。我猜想为什么我不需要新眼镜的原因搜索时间已经结束了:P – gsnerf 2009-07-03 14:45:27

您应该可以通过正确使用Grid来解决此问题,并且一些面板(DockPanelStackPanel可能非常有用)。在某些控件上,您可能还需要将HorizontalAlignmentVerticalAlignment属性设置为Stretch

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

+0

请注意,我在这里嵌套控件,第二个网格在我在第一个网格中引用的控件内部。我不能把这个网格一步一步地解决,只是用网格和面板来解决它。如果您不想运行该示例,只需创建2个控件,使用给定的网格布局并放置一些彩色画布对象。我想我描述了其余的布局。 不幸的是,由于项目限制,我无法分享确切的代码。 – gsnerf 2009-07-03 14:50:17

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

不幸的是,情况并非如此。当这些值被设置时,似乎没有任何保证,所以我使用的解决方法是钩入我想要的值的控件的事件。如果控件的宽度和高度属性发生更改,则触发SizeChanged,因此如果我处理该事件,我保证将值设置为除NaN以外的其他值。

做任何你需要在该事件处理程序中执行的逻辑,你会发现设置了这些值。