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

时间:2014-02-14 15:03:09

标签: wpf xaml width scrollviewer contentcontrol

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

主窗口的结构是这样的:

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

ContentControl的模板:

  • 网格(宽度设置为UserControl的ActualWidth,6行,其中一行设置为Auto,其中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>

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等,也将尺寸设置为ContentControlStackPanelScrollViewer和父网格。 我还尝试直接在scrollviewer上使用Datagrid s,这会产生癫痫“100万次调整大小”的情况。我也玩过HorizontalAlignments 在某些情况下,我DID设法让水平滚动条显示正确但不幸的是,我的DataGrid的*列假设为Auto宽度,而不是Star所以DataGrid启动在右边有一个空的区域(不幸的是不可接受......)

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

2 个答案:

答案 0 :(得分:5)

在我看来,这只是可怕的StackPanel布局问题的另一个案例。这个问题一再出现,我承认,当我开始学习WPF时,我遇到了同样的问题。 StackPanel 考虑其父级的可用大小,而PanelDockPanel等其他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选项。