滚动查看器中的另一个

本文关键字:另一个 滚动 | 更新日期: 2023-09-27 17:53:47

我已经开始使用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之前开始缩小其内容并显示其滚动条。

在互联网上看了很长一段时间后,我发现两个主要的建议:首先是避免使用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>

但现在我有相反的问题:内部滚动查看器总是卡在60的高度,即使我展开窗口,但我希望它占用尽可能多的空间-显示所有的蓝色矩形和隐藏滚动条,如果可能的话

有谁知道怎么做吗?

EDIT:

我已经找到了一个临时的解决方案,不完美的地方使用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>

现在它不是完美的,因为部分内容停靠在底部,但我要尝试这个作为一个解决方案,现在除非我找到更好的

滚动查看器中的另一个

我过去通过使用RelativeSource将适当的宽度绑定到父ActualWidth来解决这个问题。

参见如何将WPF绑定与RelativeSource一起使用?

Snoop对于如何在可视化树中找到你想要的属性也非常有用,参见我的教程Snoop在ReSharper WPF错误:"Cannot resolve symbol "MyVariable"由于未知的数据文本"