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

问题描述 投票:6回答:2

我正在试图弄清楚如何使我的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>

临时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上使用Datagrids,这会产生一个癫痫症“100万次调整大小”的情景。我也玩过HorizontalAlignments在某些情况下,我DID设法让水平滚动条正确显示但不幸的是,这让我的DataGrid的*列假设Auto宽度而不是Star所以DataGrid开始有一个空区域向右(不幸的是不可接受) ...)

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

wpf xaml width scrollviewer contentcontrol
2个回答
5
投票

在我看来,这只是可怕的StackPanel布局问题的另一个案例。这个问题一再出现,我承认,当我开始学习WPF时,我遇到了同样的问题。 StackPanel没有考虑其父母的可用大小,而其他Panels,如DockPanelGrid(是的,实际上也是Panel)。

它在MSDN上的How to: Choose Between StackPanel and DockPanel页面中进行了解释:

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

StackPanel应该只用于对齐许多项目,例如Buttons或其他控件直线,其中可用空间不是问题。所以无论如何,解决方案应该很简单......只需从StackPanel中移除ScrollViewer即可。无论如何,它似乎没有任何用途。


更新>>>

再看一遍之后,好像你说这个问题在DataTemplate里面,对吧?您可以通过将ItemsControl.HorizontalContentAlignment属性设置为Stretch来解决此问题。这将确保每个项目都保持在ItemsControl的边界内。

我也会删除你在Binding上的Grid.Width,因为你不需要它...一个孩子Grid默认会占用父母Grid的全部空间。如果这些想法不起作用,只需简化您的问题。说真的,如果你按照我在评论中给你的帮助中心的链接页面中的建议,那么你要么解决问题,要么能够回到这里并提供一个完整但简洁的例子,我们可以测试。


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选项。

© www.soinside.com 2019 - 2024. All rights reserved.