C# Scrollviewer在另一个

C# Scrollviewer在另一个,c#,wpf,layout,scroll,C#,Wpf,Layout,Scroll,不久前我就开始使用WPF,我一直在处理一个ScrollViewer问题,这个问题看起来很常见:我有一个ScrollViewer,它的内容多种多样,与其他内容一起显示,整个东西都在另一个ScrollViewer中。整个事情看起来是这样的: <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" Ver

不久前我就开始使用WPF,我一直在处理一个ScrollViewer问题,这个问题看起来很常见:我有一个ScrollViewer,它的内容多种多样,与其他内容一起显示,整个东西都在另一个ScrollViewer中。整个事情看起来是这样的:

<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <StackPanel Orientation="Vertical">
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto">
            <StackPanel Orientation="Vertical">
                <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
            </StackPanel>
        </ScrollViewer>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
    </StackPanel>
</ScrollViewer>

我想要的是,内部ScrollViewer开始在外部ScrollViewer之前减少其内容,这意味着如果我在一个窗口中有所有这些内容并减少窗口大小,我希望带有蓝色矩形的ScrollViewer开始在外部ScrollViewer之前减少其内容并显示其滚动条,而包含橙色矩形的ScrollViewer则会这样做

在网上浏览了很长一段时间后,我发现了两个主要的建议:第一个是避免使用StackPanel——在这个简化的示例中,我显然可以使用网格,在实际项目中,我不确定我是否可以,因为我放在这个ScrollViewer中的内容大小取决于我在其中绑定的内容。 第二个问题是我在回答一个奇怪的相似问题时发现的:

一开始似乎效果不错。生成的xaml变为:

<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
    <StackPanel Orientation="Vertical">
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <local:RestrictDesiredSize MinHeight="60">
            <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto">
                <StackPanel Orientation="Vertical">
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                </StackPanel>
            </ScrollViewer>
        </local:RestrictDesiredSize>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
    </StackPanel>
</ScrollViewer>

但现在我遇到了相反的问题:内部scrollviewer始终停留在60的高度,即使我展开窗口,但我希望它占用尽可能多的空间-显示所有蓝色矩形,如果可能,隐藏滚动条

有人知道如何做到这一点吗

编辑:

我已经找到了一个临时解决方案,它不是完美的使用DockPanel而不是StackPanel,我猜如果同时避免使用StackPanel,解决这个问题会更容易?这是我的最后一个版本

<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch">
    <DockPanel>
        <StackPanel DockPanel.Dock="Top">
            <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
            <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        </StackPanel>
        <StackPanel DockPanel.Dock="Bottom">
            <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
            <Rectangle Height="50" Width="50" Margin="5" Fill="Orange"/>
        </StackPanel>
        <local:RestrictDesiredSize MinHeight="60">
            <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch">
                <StackPanel Orientation="Vertical" VerticalAlignment="Stretch">
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                    <Rectangle Height="50" Width="50" Margin="5" Fill="Blue"/>
                </StackPanel>
            </ScrollViewer>
        </local:RestrictDesiredSize>
    </DockPanel>
</ScrollViewer>


现在它并不完美,因为部分内容固定在底部,但我现在将尝试使用它作为解决方法,除非我找到更好的方法。

我过去通过使用
相对资源
将适当的宽度绑定到父
实际宽度
,解决了这个问题


Snoop对于了解如何在可视化树中查找所需的属性也非常有用,请参阅我的关于Snoop的教程

我以前通过使用
相对资源
将适当的宽度绑定到父级
实际宽度
解决了这个问题


Snoop对于了解如何在可视化树中查找所需的属性也非常有用,请参阅我的关于Snoop的教程

你能详细说明一下吗?我花了一些时间随机绑定高度,但找不到正确的高度。添加了一些提示。您能详细说明一下吗?我花了一些时间随机绑定高度,但找不到正确的高度。添加了一些提示。您能详细说明一下吗?我花了一些时间随机绑定高度,但找不到正确的高度。添加了更多提示。