我正在试图弄清楚如何使我的 ContentControl
正确地水平滚动(此刻垂直方向) . 通过正确我的意思是我希望看到内容伸展(无限扩展),同时具有滚动条出现的最小尺寸,以便内容不会溢出 ContentControl
's area, so here' s快速介绍:
主窗口以这种方式构造:
-
网格(.3 *和.7 *的2列)
-
边界
-
网格(7行,一个设置为*,其中ContentControl是)
-
ScrollViewer与StackPanel(纯粹用于测试)包装具有自动宽度的ContentControl
ContentControl
的模板:
-
网格(宽度设置为UserControl的ActualWidth,6行,其中一行设置为Auto,其中ItemsControl为
-
ItemsControl描述了一个DataTemplate类型的ItemTemplate,其中包含一个Grid,其中我有一个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
大小的基础控件,然后列假定所有空的空间 . 当您尝试调整保存此代码的整个窗口时,它将正确生长,扩展列但是看起来萎缩不是"registered"并且它保持你扩展它的大小,在它上面应用滚动条并忘记它 .
到目前为止我所尝试的是设置 ItemsControl
的宽度,它的基础父母像Grid等,也将大小设置为 ContentControl
, StackPanel
, ScrollViewer
和父网格 . 我也尝试直接在 Datagrid
上使用 scrollviewer
,这会产生一个癫痫"1 million resizes a second"场景 . 我也玩过 HorizontalAlignments
在某些情况下,我DID设法让水平滚动条显示正确但不幸的是,这使我的 DataGrid
的*列假设 Auto
宽度而不是 Star
所以 DataGrid
开始向右空白区域(不幸的是不可接受......)
我知道为了使水平滚动条工作,滚动查看器的父或子需要宽度设置,我想我无法确定我需要限制它的确切位置 . DataGrids需要在主窗口无限扩展的同时让第一列填充所有可用空间 . 如果您需要更多相关信息,请立即告诉我,我很乐意回答 .
2 回答
在我看来,这只是可怕的
StackPanel
布局问题的另一个案例 . 这个问题一再出现,我承认,当我开始学习WPF时,我遇到了同样的问题 .StackPanel
不考虑其父级的可用大小,而其他Panel
,例如DockPanel
或Grid
(是的,实际上也是Panel
) .它在MSDN上的How to: Choose Between StackPanel and DockPanel页面中进行了解释:
StackPanel
应仅用于对齐多个项目,例如Button
或其他控件在可能空间不受关注的直线上 . 所以无论如何,解决方案应该很简单......只需从ScrollViewer
中删除StackPanel
即可 . 无论如何,它似乎没有任何用途 .更新>>>
再看一遍之后,好像你说这个问题在
DataTemplate
里面,对吧?您可以通过将ItemsControl.HorizontalContentAlignment
属性设置为Stretch
来解决此问题 . 这将确保每个项目都保持在ItemsControl
的边界内 .我也会删除
Grid.Width
上的Binding
,因为你不需要它...一个孩子Grid
默认会占用父母Grid
的全部空间 . 如果这些想法没有解决问题,或者能够回到这里并提供一个我们可以测试的完整但简洁的例子 .通过使用
UniformGrid
我找到了我正在寻找的行为作为ItemsPanel
,其行绑定到ItemsSource
模型的计数:正如@Sheridan上面所指出的,似乎
StackPanel
正在造成麻烦 . 另外,https://stackoverflow.com/a/23375262/385273用于指出UniformGrid
选项 .