在确定大小时,使WPFSL网格忽略子元素

在确定大小时,使WPFSL网格忽略子元素,第1张

概述我有一个Grid有几个孩子,其中一个是ScrollViewer.我希望Grid除了ScrollViewer之外基于它的所有子节点进行自我调整,我想要占用通过为其余子节点调整Grid的大小而创建的空间. (例如,网格为2×2,ScrollViewer位于第0行,第0列,因此其他三个网格条目足以确定网格的尺寸.) 有一个很好的方法来做到这一点?我已经研究过创建一个自定义面板来替换网格或包含Scroll 我有一个GrID有几个孩子,其中一个是ScrollVIEwer.我希望GrID除了ScrollVIEwer之外基于它的所有子节点进行自我调整,我想要占用通过为其余子节点调整GrID的大小而创建的空间. (例如,网格为2×2,ScrollVIEwer位于第0行,第0列,因此其他三个网格条目足以确定网格的尺寸.)

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

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

这是一个例子:

<GrID x:@R_403_6889@="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:@R_403_6889@="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>
总结

以上是内存溢出为你收集整理的在确定大小时,使WPF / SL网格忽略子元素全部内容,希望文章能够帮你解决在确定大小时,使WPF / SL网格忽略子元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存