gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:55:01 26 4
gpt4 key购买 nike

我有一个 Grid,它有几个子项,其中之一是 ScrollViewer。我希望 Grid 根据其所有子元素来调整自身大小,ScrollViewer 除外,我只想占用通过为其其余子元素调整 Grid 大小而创建的空间。 (例如,Grid 为 2x2,ScrollViewer 位于第 0 行、第 0 列,因此其他三个 Grid 条目足以确定 Grid 的尺寸。)

有什么好的方法可以做到这一点吗?我考虑过创建一个自定义面板来替换网格或包含 ScrollViewer,但在 MeasureOverride/ArrangeOverride 调用期间我从来没有接到过可以告诉我网格行的最终宽度/高度的电话/我关心的列(例如,第 0 行,第 0 列)。

我的一个想法是从 Grid 派生并调用基本 MeasureOverride/ArrangeOverride,但在调用之前从 Grid 的子级中删除 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>

我希望网格的大小不会随着 ScrollViewer 中按钮大小的变化而变化 - 例如,我希望网格为 ScrollViewer 提供由网格的其余内容确定的 100x100 正方形。如果我将 3 个 100x100 按钮中的每一个更改为 200x200,我希望 ScrollViewer 获得 200x200 等。

Pavlo 的示例让我得到了迄今为​​止最接近的示例,网格行/列的大小适当,但 ScrollViewer 不适应调用 Arrange 时为其指定的大小。见下文:

Image showing effect of Pavlo's NoSizeDecorator

最佳答案

如果我正确理解你想要什么,那么你可以执行以下技巧。创建一个装饰器,该装饰器将在测量阶段请求 0 空间,并在排列阶段用所有给定空间排列子项:

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,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>

关于wpf - 使 WPF/SL 网格在确定大小时忽略子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com