【问题标题】:Resizing ChildWindow height on-the-fly in Silverlight causes strange behavior在 Silverlight 中即时调整 ChildWindow 的高度会导致奇怪的行为
【发布时间】:2010-11-12 21:25:37
【问题描述】:

我在调整画布的父级(恰好是 ChildWindow)大小时遇到​​了一个奇怪的问题。

从高层次来看,这就是我在用户点击按钮时尝试做的事情:

  1. 通过将 RowDefinition 高度从 0 设置为更大的值来取消隐藏行。
  2. 调整画布大小,因为里面的所有东西都更高了。
  3. 调整画布父级(子窗口)的大小,因为画布更高。

第 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 像素的空白空间。更重要的是,当用户再次单击按钮(切换行可见性)时,行会消失,但窗口顶部的额外空间仍然存在。最初,这个空白空间并不存在。看这张图片:

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

【问题讨论】:

    标签: silverlight xaml silverlight-4.0 f#


    【解决方案1】:

    我不是这方面的专家,但是很多 WPF 渲染/调整大小都是自动发生的。我认为有一个两阶段模型,其中首先要求组件提供其首选大小/约束,然后在给定实际约束的情况下进行第二次传递。对于许多组件,您不需要进行任何明确的调整大小,因为它们会根据其子项的大小自动调整大小。听起来一般来说您可能对尺寸进行了过于精细/低级的控制,应该让 WPF 为您完成更多的工作。

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

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

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

    【讨论】:

    • 不幸的是,RowDefinition 没有 Visible/IsVisible/Visibility 属性。此外,当我隐藏 Grid Row 的所有内容时,它不会缩小为空(或隐藏自身)。据我所知,没有可以将表单字段放入的实际“行”对象......我必须分配每个单独字段的 Grid.Row。我想我可能不得不重新设计所有内容并将我的字段划分为可隐藏的子网格。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多