滚动查看器中的另一个
本文关键字:另一个 滚动 | 更新日期: 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"由于未知的数据文本"