另一个是Scrollviewer

时间:2015-06-05 14:56:00

标签: c# wpf layout scroll

我不久前开始使用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开始减少其内容并显示它在外部滚动条之前的滚动条,包含橙色矩形的滚动条。

在网上浏览了很长时间后,我发现了两个主要的建议:第一个是避免使用StackPanel - 在这个简化的例子中,我显然可以使用网格,在实际的实际项目中我不是确定我可以,因为我在这个ScrollViewer中放入的内容具有不同的大小,这取决于我在那里绑定的内容。 第二个是我在回答一个奇怪的类似问题时找到的东西:

Nested Scroll Areas

一开始似乎运作良好。结果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的高度,即使我展开窗口,但我希望它占用尽可能多的空间 - 显示所有蓝色矩形并隐藏滚动条(如果可能)

有谁知道如何实现这一目标?

编辑:

通过在某处使用DockPanel而不是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>

现在它并不完美,因为部分内容已经停靠在底部,但除非我找到更好的东西,否则我现在要尝试解决这个问题。

1 个答案:

答案 0 :(得分:0)

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

How do I use WPF bindings with RelativeSource?

Snoop对于解决如何在Visual Tree中找到所需属性非常有用,请参阅我在ReSharper WPF error: "Cannot resolve symbol "MyVariable" due to unknown DataContext"的Snoop教程。