微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在确定大小时,使WPF / SL网格忽略子元素

我有一个Grid有几个孩子,其中一个是ScrollViewer.我希望Grid除了ScrollViewer之外基于它的所有子节点进行自我调整,我想要占用通过为其余子节点调整Grid的大小而创建的空间. (例如,网格为2×2,ScrollViewer位于第0行,第0列,因此其他三个网格条目足以确定网格的尺寸.)

一个很好的方法来做到这一点?我已经研究过创建一个自定义面板来替换网格或包含ScrollViewer,但是在MeasureOverride / ArrangeOverride调用期间我没有得到一个可以告诉我网格行的最终宽度/高度的调用/列我关心(例如,第0行,第0列).

我有一个想法是从Grid派生并调用基础MeasureOverride / ArrangeOverride但在调用之前从网格的子项中删除ScrollViewer(并在之后将其放回),但在布局计算期间弄乱可视树似乎是馊主意.

这是一个例子:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left">
        <Grid.RowDeFinitions>
            <RowDeFinition/>
            <RowDeFinition/>
        </Grid.RowDeFinitions>
        <Grid.ColumnDeFinitions>
            <ColumnDeFinition/>
            <ColumnDeFinition/>
        </Grid.ColumnDeFinitions>
        <ScrollViewer Grid.Row="0" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
            <Button Height="300" Width="300"/>
        </ScrollViewer>
        <Button Grid.Row="1" Grid.Column="0" Height="100" Width="100" Content="1,0"/>
        <Button Grid.Row="0" Grid.Column="1" Height="100" Width="100" Content="0,1"/>
        <Button Grid.Row="1" Grid.Column="1" Height="100" Width="100" Content="1,1"/>
    </Grid>
</Grid>

我希望Grid的大小不会随着ScrollViewer中Button的大小的变化而改变 – 例如,我希望Grid为ScrollViewer提供100×100的平方,该平方由Grid的其余内容决定.如果我将3个100×100按钮中的每个按钮更改为200×200,我希望ScrollViewer获得200×200等等.

Pavlo的例子到目前为止让我最接近,网格行/列的大小合适,但是当调用Arrange时,ScrollViewer不适应给定的大小.见下文:

解决方法

如果我理解你想要的东西,那么你可以做以下技巧.在Measure阶段创建一个要求0空间的装饰器,并在Arrange阶段安排具有所有给定空间的子项:

public class NoSizeDecorator : Decorator
{
    protected override Size MeasureOverride(Size constraint) {
        // Ask for no space
        Child.Measure(new Size(0,0));
        return new Size(0,0);
    }        
}

而你的XAML将如下所示:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left">
        <Grid.RowDeFinitions>
            <RowDeFinition/>
            <RowDeFinition/>
        </Grid.RowDeFinitions>
        <Grid.ColumnDeFinitions>
            <ColumnDeFinition/>
            <ColumnDeFinition/>
        </Grid.ColumnDeFinitions>
        <my:NoSizeDecorator Grid.Row="0" Grid.Column="0">
            <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <Button Height="300" Width="300" Content="0,0"/>
            </ScrollViewer>
        </my:NoSizeDecorator>

        <Button Grid.Row="1" Grid.Column="0" Height="100" Width="100" Content="1,1"/>
    </Grid>
</Grid>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐