我试图弄清楚如何使ContentControl正确水平滚动(目前看来还可以)。正确地说,我的意思是我希望看到内容拉伸(stretch)(无限扩展),同时具有滚动条显示的最小尺寸,以使内容不会在ContentControl的区域后溢出,因此这里有一个快速介绍:

主窗口的结构如下:

  • 网格(.3 *和.7 *的2列)
  • 边框
  • 网格(7行,其中一个设置为*,其中ContentControl在此处)

    带StackPanel的
  • ScrollViewer(仅供测试)包装了具有自动宽度的ContentControl
  • ContentControl的模板:
  • Grid(宽度设置为UserControl的ActualWidth,6行,其中一项设置为Auto,ItemsControl进入其中)
  • ItemsControl,它描述类型为DataTemplate的ItemTemplate,该模板包含一个Grid,在其中我有一个DataGrid

  • 实际的问题是ContentControl在您调整窗口大小时会增长,但不会随着窗口调整大小而缩小。

    主 View 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和该父级Grid。
    我还尝试过直接在scrollviewer上使用Datagrid,这会产生癫痫性的“每秒100万次调整大小”的情况。我也玩过HorizontalAlignments在某些情况下,我DID设法使水平滚动条正确显示,但不幸的是,这使我的DataGrid的*列假定Auto Width而不是Star,因此DataGrid开始在右侧具有空白区域(不幸的是, Not Acceptable ...)

    我知道,为了使水平滚动条正常工作,scrollviewer的父级或子级需要设置Width,我想我无法确定需要在哪里限制它。 DataGrids需要在主窗口无限扩展的同时让第一列填充所有可用空间。
    如果您需要更多有关此方面的信息,请立即让我联系,我们将很乐意回答。

    最佳答案

    在我看来,这只是可怕的StackPanel布局问题的另一种情况。这个问题一遍又一遍地出现,我承认当我开始学习WPF时遇到了同样的问题。 StackPanel并未考虑其父项的可用大小,而其他Panel,例如DockPanelGrid(是的,实际上也是Panel)也会考虑。

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


    StackPanel仅应真正用于对齐许多项目,例如Button或不考虑可用空间的直线上的其他控件。因此,无论如何,解决方案应该很简单...只需从StackPanel中删除ScrollViewer即可。无论如何,它似乎没有任何作用。

    更新>>>

    再次查看之后,似乎您是在说问题出在DataTemplate内部,对吗?您可以通过将ItemsControl.HorizontalContentAlignment属性设置为Stretch来解决此问题。这样可以确保每个项目都保留在ItemsControl的边界内。

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

    关于当包装在ScrollViewer中时,WPF ContentControl的宽度会增加,但不会缩小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21782730/

    10-11 05:59