我试图弄清楚如何使ContentControl
正确水平滚动(目前看来还可以)。正确地说,我的意思是我希望看到内容拉伸(stretch)(无限扩展),同时具有滚动条显示的最小尺寸,以使内容不会在ContentControl
的区域后溢出,因此这里有一个快速介绍:
主窗口的结构如下:
带StackPanel的
ContentControl
的模板:实际的问题是ContentControl在您调整窗口大小时会增长,但不会随着窗口调整大小而缩小。
主 View 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>
临时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。我还尝试过直接在
scrollviewer
上使用Datagrid
,这会产生癫痫性的“每秒100万次调整大小”的情况。我也玩过HorizontalAlignments
在某些情况下,我DID设法使水平滚动条正确显示,但不幸的是,这使我的DataGrid
的*列假定Auto
Width而不是Star
,因此DataGrid
开始在右侧具有空白区域(不幸的是, Not Acceptable ...)我知道,为了使水平滚动条正常工作,scrollviewer的父级或子级需要设置Width,我想我无法确定需要在哪里限制它。 DataGrids需要在主窗口无限扩展的同时让第一列填充所有可用空间。
如果您需要更多有关此方面的信息,请立即让我联系,我们将很乐意回答。
最佳答案
在我看来,这只是可怕的StackPanel
布局问题的另一种情况。这个问题一遍又一遍地出现,我承认当我开始学习WPF时遇到了同样的问题。 StackPanel
并未考虑其父项的可用大小,而其他Panel
,例如DockPanel
或Grid
(是的,实际上也是Panel
)也会考虑。
在MSDN的How to: Choose Between StackPanel and DockPanel页面中对此进行了解释:
StackPanel
仅应真正用于对齐许多项目,例如Button
或不考虑可用空间的直线上的其他控件。因此,无论如何,解决方案应该很简单...只需从StackPanel
中删除ScrollViewer
即可。无论如何,它似乎没有任何作用。
更新>>>
再次查看之后,似乎您是在说问题出在DataTemplate
内部,对吗?您可以通过将ItemsControl.HorizontalContentAlignment
属性设置为Stretch
来解决此问题。这样可以确保每个项目都保留在ItemsControl
的边界内。
我也将删除Binding
上的Grid.Width
,因为您不需要它。默认情况下,子Grid
将占据父Grid
的全部空间。如果这些想法不起作用,请简化您的问题。认真地说,如果您遵循我在评论中提供的帮助中心链接页面中的建议,那么您将解决问题,或者可以返回此处并提供一个完整而简洁的示例,我们可以测试。
关于当包装在ScrollViewer中时,WPF ContentControl的宽度会增加,但不会缩小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21782730/