首页 文章

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

提问于
浏览
6

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

主窗口以这种方式构造:

  • 网格(.3 *和.7 *的2列)

  • 边界

  • 网格(7行,一个设置为*,其中ContentControl是)

  • ScrollViewer与StackPanel(纯粹用于测试)包装具有自动宽度的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 大小的基础控件,然后列假定所有空的空间 . 当您尝试调整保存此代码的整个窗口时,它将正确生长,扩展列但是看起来萎缩不是"registered"并且它保持你扩展它的大小,在它上面应用滚动条并忘记它 .

到目前为止我所尝试的是设置 ItemsControl 的宽度,它的基础父母像Grid等,也将大小设置为 ContentControlStackPanelScrollViewer 和父网格 . 我也尝试直接在 Datagrid 上使用 scrollviewer ,这会产生一个癫痫"1 million resizes a second"场景 . 我也玩过 HorizontalAlignments 在某些情况下,我DID设法让水平滚动条显示正确但不幸的是,这使我的 DataGrid 的*列假设 Auto 宽度而不是 Star 所以 DataGrid 开始向右空白区域(不幸的是不可接受......)

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

2 回答

  • 5

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

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

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

    StackPanel 应仅用于对齐多个项目,例如 Button 或其他控件在可能空间不受关注的直线上 . 所以无论如何,解决方案应该很简单......只需从 ScrollViewer 中删除 StackPanel 即可 . 无论如何,它似乎没有任何用途 .


    更新>>>

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

    我也会删除 Grid.Width 上的 Binding ,因为你不需要它...一个孩子 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 选项 .

相关问题