【发布时间】:2014-02-14 15:03:08
【问题描述】:
我试图弄清楚如何让我的ContentControl 正确地水平滚动(目前垂直滚动很好)。正确地说,我的意思是我希望看到要拉伸(无限扩展)的内容,同时具有滚动条出现的最小尺寸,以便内容不会在ContentControl 的区域后面溢出,所以这里有一个快速介绍:
主窗口的结构如下:
- 网格(2 列 .3* 和 .7*)
- 边框
- 网格(7 行,一组设置为 * ContentControl 所在的位置)
- 带有 StackPanel 的 ScrollViewer(纯粹用于测试)包装了具有 Auto Width 的 ContentControl
- 网格(7 行,一组设置为 * ContentControl 所在的位置)
- 边框
ContentControl的模板:
- 网格(宽度设置为 UserControl 的 ActualWidth,6 行,其中一个设置为 Auto,其中 ItemsControl 去
- ItemsControl 描述了 DataTemplate 类型的 ItemTemplate,其中包含一个网格,其中我有一个 DataGrid
实际的问题是 ContentControl 会随着您调整窗口大小而增长,但不会随着窗口大小调整而缩小。
主视图 XAML(为清楚起见已截断):
<ScrollViewer Grid.Row="5" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ContentControl Grid.Row="5" Background="Transparent" Focusable="False" Margin="0,5,0,0"
Content="{Binding CurrentSection}" ContentTemplateSelector="{StaticResource templateSelector}/>
</ScrollViewer>
Tempate XAML(为清楚起见截断):
<Grid>
...
<ItemsControl Grid.Row="4" ItemsSource="{Binding Data.QualifyingDistributionsDividends}" x:Name="QualifyingItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid x:Name="DTLayoutGrid">
...
<Grid Grid.Row="1" x:Name="DataLayout" Width="{Binding ElementName=DTLayoutGrid, Path=ActualWidth}" HorizontalAlignment="Stretch">
...
<DataGrid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="8" HorizontalScrollBarVisibility="Disabled"
ItemsSource="{Binding Payments}" Style="{StaticResource DataGridStyle}" CellStyle="{StaticResource DataGridNormalCellStyle}">
</DataGrid>
</Grid>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
那么会发生什么? Datagrid 假定整个 DataTemplate 的宽度(以及它的底层控件设置为 DataTemplates 大小,然后 * 列假定所有空白空间。当您尝试调整包含此代码的整个窗口的大小时,它将正确增长, 扩展 * 列,但它似乎没有“注册”收缩,它保持你扩展它的大小,在上面应用滚动条并忘记它。
到目前为止,我尝试的是为 ItemsControl 设置宽度,它的底层父级如 Grid 等,还将大小设置为 ContentControl、StackPanel、ScrollViewer 和父级 Grid。
我还尝试在Datagrid 上直接使用scrollviewers,这会产生癫痫“每秒调整一百万”的场景。我也玩过HorizontalAlignments
在某些情况下,我确实设法让水平滚动条正确显示,但不幸的是,这使我的DataGrid 的 * 列假设Auto 宽度而不是Star 所以DataGrid 开始在右侧有一个空白区域(不幸的是无法接受...)
我知道为了让水平滚动条工作,滚动查看器的父级或子级需要设置宽度,我想我无法确定我需要在哪里限制它。 DataGrids 需要随着主窗口无限扩展,同时让第一列填满所有可用空间。 如果您需要这方面的更多信息,请立即告诉我,我会很乐意回答。
【问题讨论】:
-
将 Grid 的宽度提供给 ContentControl 会做出正确的反应,但是一旦达到最小尺寸,模板就会溢出并且不会出现滚动条,给它一个
HorizontalAlignment="Stretch"什么都不做,删除ScrollViewer.CanContentScroll="False"也是如此 -
老兄……这太长了……我们不需要你的生活史,只需要relevant part of your program。
-
如何详细解释一个问题,以便人们更好地理解它的生活故事?由于未知问题的来源,必须放入大量代码。我想我会削减 sn-ps...
-
原谅我的措辞...我只是给你很好的建议来帮助你回答你的问题。这里的许多用户会看到您的问题持续了多长时间,然后简单地转到下一个问题。 +1 虽然做得更简洁,但做得很好。
-
别担心!我在想这不是一件容易的事,所以决定详细说明这个场景。
标签: wpf xaml width scrollviewer contentcontrol