【问题标题】:How to access actual Height of Elements with Height=Auto如何使用 Height=Auto 访问元素的实际高度
【发布时间】:2009-07-03 14:28:39
【问题描述】:

我有这样的情况:

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

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

【问题讨论】:

    标签: silverlight actualheight


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 由于控件刚刚变得可见,因此该值似乎包含“旧”值(0 表示刚刚变得可见的元素和一些值取决于现在更改的状态信息)。嗯,也许我可以找到一些事件来在控件可见后触发计算。无论如何,感谢 ActualHeight。我想为我不需要新眼镜寻找借口的时代已经结束了:P
      【解决方案3】:

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

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

      【讨论】:

      • 请注意我这里有嵌套控件,第二个网格在我在第一个网格中引用的控件内。我不能让那个网格更上一层楼,只用网格和面板来解决它。如果您不想运行该示例,只需使用给定的网格布局创建 2 个控件并放置一些彩色画布对象。我想我描述了布局的其余部分。不幸的是,由于项目限制,我无法分享确切的代码。
      • 实际上,我建议更多的嵌套,而不是更少。如有必要,将面板放入网格中(并将网格放入那些嵌套面板中)。
      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2023-03-18
      • 2010-09-22
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多