我正在试图弄清楚如何使我的ContentControl
正确地水平滚动(此时垂直向上)。通过正确我的意思是我希望看到内容拉伸(无限扩展),同时具有滚动条出现的最小尺寸,以使内容不会溢出ContentControl
区域后面,所以这里是一个快速介绍:
主窗口的结构是这样的:
ContentControl
的模板:
实际问题是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
和父网格。
我还尝试直接在scrollviewer
上使用Datagrid
s,这会产生癫痫“100万次调整大小”的情况。我也玩过HorizontalAlignments
在某些情况下,我DID设法让水平滚动条显示正确但不幸的是,我的DataGrid
的*列假设为Auto
宽度,而不是Star
所以DataGrid
启动在右边有一个空的区域(不幸的是不可接受......)
据我所知,为了让水平滚动条工作,滚动查看器的父或子需要宽度设置,我想我无法确定我需要限制它的确切位置。 DataGrids需要在主窗口无限扩展的同时让第一列填充所有可用空间。 如果您需要更多相关信息,请立即告诉我,我很乐意回答。
答案 0 :(得分:5)
在我看来,这只是可怕的StackPanel
布局问题的另一个案例。这个问题一再出现,我承认,当我开始学习WPF时,我遇到了同样的问题。 StackPanel
不考虑其父级的可用大小,而Panel
或DockPanel
等其他Grid
(是的,这实际上也是一个Panel
。
MSDN上的How to: Choose Between StackPanel and DockPanel页面对此进行了解释:
虽然您可以使用DockPanel或StackPanel来堆叠子元素,但这两个控件并不总是产生相同的结果。例如,放置子元素的顺序可能会影响DockPanel中子元素的大小,但不会影响StackPanel中的子元素的大小。出现这种不同的行为是因为StackPanel在Double.PositiveInfinity的堆叠方向上测量;但是,DockPanel仅测量可用的大小。
StackPanel
应仅用于对齐多个项目,例如Button
s或其他控件在可用空间不关注的直线上。所以无论如何,解决方案应该很简单......只需从StackPanel
中删除ScrollViewer
即可。无论如何,它似乎没有任何用途。
更新&gt;&gt;&gt;
再看一遍后,好像你说问题是里面 DataTemplate
,对吧?您可能可以通过将ItemsControl.HorizontalContentAlignment
属性设置为Stretch
来解决此问题。这将确保每个项目都保持在ItemsControl
的边界内。
我还会删除您Binding
上的Grid.Width
,因为您不需要它......孩子Grid
会占用父母{{1}的全部空间}} 默认情况下。如果这些想法不起作用,只需简化您的问题。说真的,如果你按照我在评论中给你的帮助中心的链接页面中的建议,那么你要么解决问题,要么能够回到这里并提供一个完整但简洁的例子,我们可以测试
答案 1 :(得分:0)
我通过使用UniformGrid
作为ItemsPanel
找到了我想要的行为,其行绑定到ItemsSource
模型的数量:
<ScrollViewer>
<ItemsControl ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding MyCollection.Count}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
正如@Sheridan指出的那样,似乎StackPanel
正在引起麻烦。另外,请记入https://stackoverflow.com/a/23375262/385273来指出UniformGrid
选项。