我试图为两个垂直放置的子项创建一个面板类StickyInfoPanel
。两个项目中的较低者应为100px高。上部物品应消耗剩余的总可用高度。
最上面的项目是一个ScrollView,里面有一个堆栈面板,里面有两个孩子(upper1和upper2)。因此,只要堆栈面板没有足够的空间,就应该显示垂直滚动条,如下图所示:
尽管在“编配”阶段将正确的高度传递给了上部项目,但其最终产生的高度更高,因此滚动条不显示。 (请参阅第二张屏幕截图)
仅当窗口进一步减小时,仅可以显示upper1时,才会出现滚动条。但是它的向下按钮仍然不见了(请参阅第三个屏幕截图)
奇怪的是,当将正确的所需高度传递给MeasureOverride
上的项目时,一切都会按预期进行。
据我了解,MeasureOverride应该没有副作用,而显然不是。谁能解释一下,我在这里缺少什么?
<Window x:Class="GridTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GridTest"
Title="MainWindow" Height="190.57" Width="800">
<local:StickyInfoPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
<ScrollViewer Background="LightYellow" VerticalScrollBarVisibility="Auto" CanContentScroll="false">
<StackPanel Margin="30 0" CanVerticallyScroll="False">
<TextBlock Background="AliceBlue" Height="100">upper1</TextBlock>
<TextBlock Background="Azure" Height="100">upper2</TextBlock>
</StackPanel>
</ScrollViewer>
<TextBlock Background="Gainsboro" Height="100">Lower</TextBlock>
</local:StickyInfoPanel>
</Window>
class StickyInfoPanel : Panel
{
public StickyInfoPanel()
: base()
{
}
protected override Size MeasureOverride(Size availableSize)
{
InternalChildren[0].Measure(availableSize);
InternalChildren[1].Measure(availableSize);
//this works:
//InternalChildren[0].Measure(new Size(availableSize.Width, availableSize.Height - 100));
return availableSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
InternalChildren[0].Arrange(new Rect(new Point(0, 0), new Size(finalSize.Width, finalSize.Height - 100)));
InternalChildren[1].Arrange(new Rect(new Point(0, finalSize.Height - 100), new Size(finalSize.Width, 100)));
return finalSize;
}
}
答案 0 :(得分:0)
因此,在进行一些测量之后,这是在自定义面板中生成的子元素大小的最终公式(最小和最大运算符在此处按元素工作):
actualSize = max(min(availableSize,desireSizeTheoretical),finalSize)
哪里
或者说句话:除非子元素需要更多的空间 并被承诺在MeasureOverride中有更多的空间,否则结果大小将始终为finalSize。在这种情况下,结果大小将是这两个值中较小的一个。
已找到ScrollViewer的子元素。我希望其他类的行为相同。