0

我有这样的情况:

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

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

4

3 回答 3

2

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

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

执行您需要在该事件的处理程序中执行的任何逻辑,您会发现值已设置。

于 2009-08-10T13:58:35.547 回答
1

您是否尝试过在控件上使用ActualHeight属性?

于 2009-07-03T14:32:16.643 回答
0

您应该能够通过正确使用Grid和一些面板来解决这个问题(DockPanel并且StackPanel可能非常有用)。您可能还需要在某些控件上设置HorizontalAlignmentVerticalAlignment属性。Stretch

您的示例不足以让我们复制您的问题或知道我们已经正确解决了它。如果您需要更具体的帮助,请扩展示例以便我们运行它并查看您的问题。

于 2009-07-03T14:44:21.997 回答