WPF ContentControl宽度增长但在ScrollViewer中包装时不会缩小

kos*_*dos 6 wpf xaml scrollviewer width contentcontrol

我正在试图弄清楚如何让我ContentControl正确地水平滚动(此刻垂直方向).通过正确我的意思是我希望看到内容伸展(无限扩展),同时具有滚动条出现的最小尺寸,以使内容不会溢出该ContentControl区域,所以这里是一个快速介绍:

主窗口以这种方式构造:

  • 网格(.3*和.7*的2列)
    • 边界
      • 网格(7行,一个设置为*,其中ContentControl是)
        • ScrollViewer与StackPanel(纯粹用于测试)包装具有自动宽度的ContentControl

ContentControl的模板:

  • 网格(宽度设置为UserControl的ActualWidth,6行,其中一行设置为自动,其中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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

那会发生什么?Datagrid假设整个宽度DataTemplate(以及其设置为DataTemplates大小的底层控件,然后*列假定所有空的空间.当您尝试调整保存此代码的整个窗口时,它将正确生长,扩展*列但似乎缩小没有"注册",它保持你扩展它的大小,在其上应用滚动条并忘记它.

我已经试过到目前为止是设置宽度ItemsControl,其潜在的父母喜欢网等,还设置大小ContentControl,StackPanel,ScrollViewer那和家长电网.我也试过scrollviewer直接使用s Datagrid产生一个癫痫"100万调整一秒"的场景.我也有发挥各地HorizontalAlignments 在某些情况下,我没有设法拿到了水平滚动条来正确显示但不幸的是,让我DataGrid的*柱承担Auto宽度而不是Star这样DataGrid开始有一个空白区域向右(不可接受的不幸... )

我知道为了使水平滚动条工作,滚动查看器的父或子需要宽度设置,我想我无法确定我需要限制它的确切位置.DataGrids需要在主窗口无限扩展的同时让第一列填充所有可用空间.如果您需要更多相关信息,请立即告诉我,我很乐意回答.

She*_*dan 5

在我看来,这只是可怕的StackPanel布局问题的另一种情况。这个问题一遍又一遍地出现,我承认当我开始学习WPF时遇到了同样的问题。该StackPanel不会采取其父的可用大小考虑,而其他PanelS,从而为一个DockPanel或一个Grid(是的,这实际上是一个Panel太)做的。

在MSDN上的“ 如何:在StackPanel和DockPanel之间选择”页面中对此进行了说明:

尽管可以使用DockPanel或StackPanel来堆叠子元素,但两个控件并不总是产生相同的结果。例如,子元素的放置顺序会影响DockPanel中子元素的大小,但不会影响StackPanel中子元素的大小。发生这种不同的行为是因为StackPanel在Double.PositiveInfinity;处沿堆叠方向进行测量。但是,DockPanel仅测量可用大小。

StackPanel应只有真正被用于对准了一些项目,如Button在一条直线S或其他控件,其中可用空间是不是一个问题。因此,无论如何,解决方案应该很简单...只需StackPanel从中删除即可ScrollViewer。无论如何,它似乎没有任何作用。


更新>>>

再次看后,好像你说的问题是内部DataTemplate,对不对?您可以通过将ItemsControl.HorizontalContentAlignment属性设置为来解决此问题Stretch。这样可以确保每个项目都保持在的范围内ItemsControl

我也将删除您的BindingGrid.Width因为您不需要... 默认情况下,孩子Grid将占用父母的全部空间Grid。如果这些想法不起作用,请简化您的问题。认真地说,如果您遵循我在评论中提供的帮助中心链接页面中的建议,那么您将解决问题,或者可以返回此处并提供完整但简洁的示例,测试。