Silverlight中实时调整ChildWindow高度会导致奇怪的行为

6

当我调整一个画布的父元素大小时,遇到了一个奇怪的问题,这个父元素恰好是一个ChildWindow。

从高层次上讲,当用户点击一个按钮时,我要做的事情如下:

  1. 通过将RowDefinition的高度从0设置为更大的值来取消隐藏一行。
  2. 调整画布的大小,因为里面的所有内容都更高了。
  3. 调整画布的父级元素(即ChildWindow),因为画布更高了。

步骤1和2正常工作。问题出在第3步:当我在F# / Silverlight代码中进行步进时,所有尺寸似乎都被正确设置了。问题在于,ChildWindow在屏幕上呈现出比它实际应该的要高得多的样子。

看下面的示例:

member this.btnWhatever_Click(sender : obj) (args : RoutedEventArgs) =
    let parentWindow = this.Parent :?> ChildWindow // get the canvas' parent, and cast it to a ChildWindow
    // if the RowDefinition height is set to our standard, the hide it by setting it to 0
    if this.aRowDefinition.Height.Value.Equals STANDARD_ROW_HEIGHT then
        this.aRowDefinition.Height <- new GridLength(0.)
        this.Height <- this.Height - HEDGE_ROW_HEIGHT
        parentWindow.Height <- parentWindow.Height - STANDARD_ROW_HEIGHT
        this.btnCreateOrRemoveHedge.Content <- "On"
    // otherwise, unhide the RowDefinition by setting it to the standard height
    else
        this.aRowDefinition.Height <- new GridLength(STANDARD_ROW_HEIGHT)
        this.Height <- this.Height + STANDARD_ROW_HEIGHT
        parentWindow.Height <- parentWindow.Height + STANDARD_ROW_HEIGHT
        this.btnWhatever.Content <- "Off"
    ()

在这种情况下,我的STANDARD_ROW_HEIGHT只有23像素,但是用户单击按钮后,在标题栏下方的ChildWindow中添加了92个像素的空白空间。更重要的是,当用户再次单击按钮(切换行可见性)时,行消失但窗口顶部的额外空间仍然存在。最初,这个空白空间并不存在。请参见此图像:
任何想法/帮助将不胜感激。谢谢!
1个回答

1
我不是这方面的专家,但很多WPF渲染/大小调整都是自动完成的。我认为有一个两阶段模型,首先组件会被要求提供其首选大小/约束条件,然后第二遍根据实际约束条件进行布局。对于许多组件,您不需要进行任何显式的大小调整,因为它们将根据其子元素的大小自动调整大小。总的来说,听起来您可能正在过度控制大小,应该让WPF为您做更多的工作。
要“隐藏”一行,我打赌最好的方法可能是切换.Visible属性,而不是将其高度设置为零。
看起来您可能正在向父级添加显式高度,但实际上不需要,因为WPF已经会重新调整父级大小,因为现在它包含了更多可见内容。在任何地方都不设置父级高度可能会解决问题。
(这些是来自一个不太了解WPF的用户的随机建议,祝你好运 :) )

不幸的是,RowDefinition没有Visible/IsVisible/Visibility属性。此外,当我隐藏Grid行的所有内容时,它不会缩小到零(或隐藏自己)。据我所知,没有实际的“行”对象可以将我的表单字段放入其中...我必须分配每个单独字段的Grid.Row。我想我可能需要重新设计一切,并将我的字段分成可隐藏的子网格。 - Mike Cialowicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接