WPF Grid未显示滚动条

33

在.NET 3.5中,我有一个窗口中的网格。我正在使用按钮填充此网格。当按钮填满网格并超出视图时,网格不显示滚动条。我已将网格的垂直滚动条设置为可见,但仍未显示。

<Window x:Name="Window" x:Class="MergeToCheck.CheckList"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Loaded="Window_Loaded" ScrollViewer.VerticalScrollBarVisibility="Disabled"
                ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True" WindowStyle="None" 
        Height="671" Width="846.299" BorderThickness="5">

    <Grid>
        <Grid x:Name="MyGrid" HorizontalAlignment="Left" Height="535" VerticalAlignment="Top" Width="736" Margin="10,63,0,0" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible">
            <Grid.Resources>
                <Style TargetType="{x:Type Panel}">
                    <Setter Property="Margin" Value="0,0,0,6" />
                </Style>
            </Grid.Resources>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
        </Grid>        
    </Grid>
</Window>

添加按钮的代码:

        CheckList CheckListCtrl = new CheckList();

        System.Windows.Controls.Button btn;
        int row = 0;
        int col = 0;

        CheckListCtrl.MyGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(100) });

        foreach(var c in list)
        {
            btn = new System.Windows.Controls.Button();
            btn.FontSize = 15;
            btn.FontWeight = FontWeights.UltraBold;
            btn.Content = c.Name;
            btn.Style = System.Windows.Application.Current.FindResource(System.Windows.Controls.ToolBar.ButtonStyleKey) as Style;
            btn.BorderBrush = new SolidColorBrush(Colors.Black);
            btn.BorderThickness = new Thickness(2);
            btn.MinWidth = 145;
            btn.MaxWidth = 145;
            btn.MinHeight = 95;
            btn.MaxHeight = 95;

            btn.SetValue(Grid.RowProperty, row);
            btn.SetValue(Grid.ColumnProperty, col);

            CheckListCtrl.MyGrid.Children.Add(btn);

            if ((col + 1) % CheckListCtrl.MyGrid.ColumnDefinitions.Count == 0)
            {                    
                col = 0;
                row++;
                CheckListCtrl.MyGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(100) });
            }
            else
                col++;
        }

如果您的网格有足够的空间显示所有项目,则滚动条不会出现。只有当项目超过空间时,滚动条才会出现。您确定您的网格中有更多的项目超过了空间吗? - Sonhja
我100%确定它已经用完了空间,但如果我设置ScrollViewer.HorizontalScrollBarVisibility="Visible",它应该始终显示滚动条,无论是否有足够的空间。 - CathalMF
3
网格不包括任何类型的滚动条。如果您想要滚动,您需要使用ScrollViewer,例如 <ScrollViewer><Grid>...</Grid></ScrollViewer> - dkozl
@dkozl,这个方法很有效。你想把它作为答案来获得一些积分吗? - CathalMF
重复问题:https://dev59.com/j0fRa4cB1Zd3GeqP9oFz - amit jha
@amitjha 这可能是一个重复的问题,但这个问题和答案的质量更好。 - CathalMF
3个回答

81

Grid不支持滚动功能。如果您想要滚动内容,您需要使用ScrollViewer控件。

<ScrollViewer HorizontalScrollBarVisibility="Visible">
   <Grid x:Name="MyGrid" HorizontalAlignment="Left" Height="535" VerticalAlignment="Top" Width="736" Margin="10,63,0,0">
      <Grid.Resources>
         <Style TargetType="{x:Type Panel}">
            <Setter Property="Margin" Value="0,0,0,6" />
         </Style>
      </Grid.Resources>
      <Grid.ColumnDefinitions>
         <ColumnDefinition/>
         <ColumnDefinition/>
         <ColumnDefinition/>
         <ColumnDefinition/>
         <ColumnDefinition/>
      </Grid.ColumnDefinitions>
   </Grid>        
</ScrollViewer>

这仍然不能保证显示滚动查看器。如果WPF认为ScrollViewer内部的元素已经完全可见,则即使将其Visibility显式设置为True,ScrollViewer仍然保持不可见。 - J S
没有一段代码可以保证显示滚动条。没有一段代码可以保证任何事情的实现,完结撒花 ‍♂️ - dkozl

8

一般而言,必须告诉ScrollViewer它比其内容小。因此,仅添加一个ScrollViewer并不总是足够使控件可滚动。如果包含它的控件具有固定或最大尺寸,或者它本身具有固定高度或最大高度,那么ScrollViewer会知道它比它的容器小。

<ScrollViewer Height=500 HorizontalScrollBarVisibility="Visible">
...
</ScrollViewer>

同样的情况也适用于水平滚动栏,即使您将其设置为可见,如果 ScrollViewer 的宽度没有受到限制,那么 ScrollViewer 将会扩展到其内容的大小。 如果此时滚动条的可见性为“自动”,它将不会显示滚动条,如果为“可见”,则会显示一个禁用的滚动条。(请注意,HorizontalScrollbarVisibility 默认为“禁用”)。 为了获得有用的水平滚动条,请限制 ScrollViewer 的宽度,并将其 HorizontalScrollbarVisibility 设置至少为“自动”。


0
我想补充一点。如果你仍然看不到滚动条,请在ScrollViewer中添加PADDING属性。这个方法解决了我的应用程序问题。

在您的情况下,给ScrollViewer添加Padding可能会使其内容的空间变小,以至于它决定现在需要滚动。但是在一般情况下,如果ScrollViewer的高度本身没有限制,它将扩展到其内容的大小(加上潜在的Padding),并且不显示滚动条,请参见我下面的答案。 - J S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接