Width
的{{1}}仍为"正常"如果像这样使用:
ScrollViewer
说&#34;正常&#34;我的意思是<Grid>
<ScrollViewer>
<Rectangle Width="2500"/>
</ScrollViewer>
</Grid>
ScrollViewer
与Width
(我的情况下为1500)相同,因为我没有提及他们自己Grid
。至少那是我所知道的。
但是,如果上面的部分是在StackPanel中进行的,那么:
Width
然后<StackPanel Orientation="Horizontal">
<Grid>
<ScrollViewer>
<Rectangle Width="2500"/>
</ScrollViewer>
</Grid>
</StackPanel>
&#39; ScrollViewer
变为2500,因为它的内容为Width
。
原因是什么?
答案 0 :(得分:1)
XAML中的布局过程分为两个阶段:测量和排列。
在测量阶段,通常,大多数小组会询问他们的孩子“你想成为什么尺码?” (这将有效地走下树)。孩子的父母可以根据孩子的大小决定自己想要的体型。它会在Size
方法中返回此MeasureOverride
。
一旦测量完所有内容,就可以在屏幕上实际排列并布置内容。这是在确定元素的实际大小时。系统首先告诉每个元素“这是你有多少空间”。然后,每个面板从顶部开始,然后可以告诉它的孩子在其空间内的位置以及它实际需要占用多少空间(通过在Arrange
方法中对每个孩子调用ArrangeOverride
来完成父自定义面板)。
您可以查看此here的完整文档。
所以在你的两个例子中,结果是不同的,因为Grids和StackPanels的行为如何:
以网格为根,在您的顶部示例中,它会占用可用空间并告诉其子项必须在其中。所以ScrollViewer说它想要更大,因为它的子矩形,但最后Grid表示你只有1500单位的空间,因为这就是它的全部。因此,如果您打开HorizontalScrollBarVisibility
以让平移以查看整个矩形,ScrollViewer将显示滚动条。
以StackPanel为根,它将展开以适应其子节点的大小。因此,当ScrollViewer告诉Grid它希望它的内容为这个大小时,它会通过Grid传递给StackPanel。当安排时,StackPanel告诉Grid它有它所请求的所有空间,这是Rectangle想要的额外空间。这个额外的空间在显示时最终会被页面/窗口剪切掉。
这就是为什么有这么多不同的布局面板可用,因为它们在这两个步骤中的行为都不同,以便为期望的效果排列一个或多个内容项。这也是为什么在任何地方使用StackPanels都很棘手,因为与其他面板相比,它们总是比较贪婪,而这些面板的行为会更“可预测”。