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
ContentControl
的模板:

  • 网格(宽度设置为UserControl的实际宽度,6行,其中一行设置为Auto where ItemsControl
    • ItemsControl,描述DataTemplate类型的ItemTemplate,该类型包含一个网格,其中我有一个DataGrid
实际问题是ContentControl会随着窗口大小的调整而增加,但不会随着窗口大小的调整而收缩

主视图XAML(为清晰起见截断):



在我看来,这只是可怕的
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>