首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有副作用的MeasureOverride?

有副作用的MeasureOverride?
EN

Stack Overflow用户
提问于 2018-07-24 22:01:36
回答 1查看 195关注 0票数 1

情况:

我正在尝试为垂直布局的两个子项创建一个面板类StickyInfoPanel。两项中较低的一项高度应为100px。上面的项目将消耗总可用高度的其余部分。

上面的项目是一个带有堆叠面板和两个子级(upper1和upper2)的ScrollView。因此,只要堆栈面板没有足够的空间,垂直滚动条就会出现,如下图所示:

问题是:

尽管在排列阶段会将正确的高度传递给上面的项,但其结果高度会更高,因此不会显示滚动条。(见第二个屏幕截图)

只有当窗口进一步缩小,以便只能显示upper1时,才会出现滚动条。但它的向下按钮仍然没有(见第三个屏幕截图)

奇怪的是,当从MeasureOverride向项目传递正确的所需高度时,一切都按预期进行。

据我所知,MeasureOverride应该是无副作用的,但事实显然并非如此。谁能解释一下,我在这里遗漏了什么?

XAML:

代码语言:javascript
复制
<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>

panel类:

代码语言:javascript
复制
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; 
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-25 22:22:57

因此,经过一些测量之后,下面是自定义面板中生成子元素大小的最终公式(最小和最大运算符在这里按元素工作):

actualSize = max( min( availableSize,desiredSizeTheoretical),finalSize )

哪里

  • actualSize是子元素的结果大小
  • availableSize是面板从其自己的MeasureOverride传递给元素的度量方法的大小available
  • finalSize是如果存在无限空间时该子元素希望占用的大小available
  • finalSize是面板从其自己的ArrangeOverride

传递给子元素的MeasureOverride方法的大小

或者换句话说:结果大小始终是finalSize,除非子元素需要更多空间,并且在MeasureOverride中承诺有更多空间。在这种情况下,结果大小将是这两个值中较小的一个。

对于作为子元素的ScrollViewer,已经找到了这种情况。我希望,其他类也会有同样的表现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51500624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档