在Silverlight中动态调整ChildWindow高度会导致奇怪的行为

Mik*_*icz 6 silverlight xaml f# silverlight-4.0

在调整画布的父级时,我遇到了一个奇怪的问题,它恰好是一个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"
    ()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我的STANDARD_ROW_HEIGHT只有23像素,但在用户单击按钮后,标题栏下方的ChildWindow中还会添加一个92像素的空白空间.更重要的是,当用户再次单击该按钮(切换行可见性)时,该行消失,但窗口顶部的额外空间仍然存在.最初,这个空的空间不存在.看这个图片:

替代文字

任何想法/帮助将不胜感激.谢谢!

Bri*_*ian 1

我不是这方面的专家,但很多 WPF 渲染/调整大小都是自动发生的。我认为有一个两阶段模型,其中第一个组件被要求提供其首选的尺寸/约束,然后第二遍根据实际约束列出内容。对于许多组件,您不需要执行任何显式调整大小,因为它们将根据其子组件的大小自动调整大小。听起来一般来说您可能对尺寸进行了过于精细/低级的控制,并且应该让 WPF 为您做更多的工作。

要“隐藏”一行,我敢打赌切换.Visible属性可能比将其高度设置为零更好。

听起来好像您可能正在向父级添加显式高度,但不需要这样做,因为 WPF 已经要调整父级的大小,因为现在它包含更多可见内容。永远不要将父级高度设置为任何地方的任何东西,可能会解决这个问题。

(这些是来自不太了解情况的 WPF 用户的随机建议,祝你好运:))