WPF ContentControl宽度增加,但不增加';在ScrollViewer中包装时不会收缩
我正在试图弄清楚如何使我的WPF ContentControl宽度增加,但不增加';在ScrollViewer中包装时不会收缩,wpf,xaml,width,scrollviewer,contentcontrol,Wpf,Xaml,Width,Scrollviewer,Contentcontrol,我正在试图弄清楚如何使我的ContentControl正确地水平滚动(此时垂直滚动很好)。正确地说,我的意思是我希望看到内容被拉伸(无限扩展),同时具有滚动条显示的最小大小,以便内容不会溢出ContentControl的区域,因此这里有一个快速介绍: 主窗口的结构如下所示: 网格(2列,分别为.3*和.7*) 边界 网格(7行,一个设置为*其中ContentControl为) ScrollViewer带有StackPanel(纯粹用于测试)包装具有自动宽度的ContentControl
ContentControl
正确地水平滚动(此时垂直滚动很好)。正确地说,我的意思是我希望看到内容被拉伸(无限扩展),同时具有滚动条显示的最小大小,以便内容不会溢出ContentControl
的区域,因此这里有一个快速介绍:
主窗口的结构如下所示:
- 网格(2列,分别为.3*和.7*)
- 边界
- 网格(7行,一个设置为*其中ContentControl为)
- ScrollViewer带有StackPanel(纯粹用于测试)包装具有自动宽度的ContentControl
- 网格(7行,一个设置为*其中ContentControl为)
- 边界
ContentControl
的模板:
- 网格(宽度设置为UserControl的实际宽度,6行,其中一行设置为Auto where ItemsControl
- ItemsControl,描述DataTemplate类型的ItemTemplate,该类型包含一个网格,其中我有一个DataGrid
在我看来,这只是可怕的StackPanel
布局问题的另一个例子。这个问题一次又一次地出现,我承认我在开始学习WPF时也遇到了同样的问题。StackPanel
没有考虑其父面板的可用大小,而其他面板则是如此h作为DockPanel
或Grid
(是的,这实际上也是面板
)所做的
MSDN上的页面对此进行了解释:
虽然可以使用DockPanel或StackPanel堆叠子元素,但这两个控件并不总是产生相同的结果。例如,放置子元素的顺序可能会影响DockPanel中的子元素大小,但不会影响StackPanel中的子元素大小。发生这种不同的行为是因为StackPanel的测量方向为st以Double.PositiveInfinity进行确认;但是,DockPanel仅测量可用大小
StackPanel
实际上只能用于对齐多个项目,例如按钮
或其他控件,在不考虑可用空间的直线上。因此,解决方案应该很简单…只需从ScrollViewer
中删除StackPanel
。它似乎没有任何用途不管怎样,我还是在那里
更新>>>
再次查看后,似乎您是在说问题在数据模板
内,对吗?您可以通过将ItemsControl.HorizontalContentAlignment
属性设置为Stretch
,来解决这个问题。这样可以确保每个项都保持在ItemsControl
的边界内
我还将删除网格上的绑定。宽度
,因为您不需要它…默认情况下,孩子网格
将占据家长网格
的全部空间。如果这些想法不起作用,只需简化您的问题。说真的,如果您遵循我在注释,然后您可以修复问题,或者回到这里,提供一个完整但简洁的示例,我们可以对其进行测试。我通过使用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
似乎在制造麻烦。另外,值得赞扬的是,指出了UniformGrid
选项。为ContentControl提供网格宽度是正确的,但一旦达到最小大小,模板就会溢出,并且没有滚动条出现,这给了它一个HorizontalAalignment=“Stretch”
不做任何事情,删除ScrollViewer.CanContentScroll=“False”也不做任何事情
Dude…那太长了…我们不需要你的生活史,只需要你的故事。如何详细解释一个问题,让人们更好地理解它是一个生活故事?由于不知道问题来自何处,必须输入大量代码。我想我会删掉片段…请原谅我的段落…我只是给你一个好消息帮助你回答问题的建议。这里的许多用户都会看到你的问题有多长,然后简单地转到下一个问题上。+1做得很好,让它更简洁。不用担心!我认为这不是一个简单的问题,所以决定详细说明这个场景。是的,我添加了stackpanel作为测试,用ju代替它st一个网格似乎有着相似的结果,但略有不同,当滚动条出现时,最多只有1个像素,不幸的是,无法收缩ContentControl
的问题仍然存在。移除它与在那里使用网格
没有什么区别。我个人还没有尝试过DockPanel
避免它,但我还是会尝试一下。我会在睡觉后尝试制作一个小的重新编程应用程序,看看这是否会更有意义,也许这会更准确地指出问题的根源。问题是网格.Width
。不幸的是,删除它会使中的所有列都变成星形>Datagrid
s采用自动大小,这是我首先尝试解决的问题,因为第一列需要假定所有可用的屏幕空间。我已经剥离了所有内容,并了解到这只是一个典型的问题,其中ScrollViewer元素中的DataGrids
<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>
<ScrollViewer>
<ItemsControl ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding MyCollection.Count}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>