WPF Grid不显示滚动条

Posted

技术标签:

【中文标题】WPF Grid不显示滚动条【英文标题】:WPF Grid not showing scroll bars 【发布时间】:2014-12-31 11:03:57 【问题描述】:

在 .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++;
        

【问题讨论】:

如果您的网格有足够的空间来显示所有项目,则不会出现滚动条。仅当项目多于空间时才会出现滚动条。您确定网格中的项目多于空间吗? 是的,我 100% 确定它已经用完了空间,但是如果我设置 ScrollViewer.Horizo​​ntalScrollBarVisibility="Visible" 它应该始终显示滚动条,无论它是否有足够的空间。 网格不包括任何类型的滚动条。如果你想滚动,你需要ScrollViewer,比如&lt;ScrollViewer&gt;&lt;Grid&gt;...&lt;/Grid&gt;&lt;/ScrollViewer&gt; @dkozl 成功了。你想把它作为一个答案来获得一些分数。 重复问题:***.com/q/839062 【参考方案1】:

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 中的元素已经完全可见,则 ScrollViewer 保持不可见,即使其 Visibility 显式设置为 True。 没有任何一段代码可以保证显示滚动条。没有任何一段代码可以保证任何事情完全停止?‍♂️【参考方案2】:

一般来说,一个 ScrollViewer 需要被告知它比它的内容要小。因此,仅仅添加一个 ScrollViewer 来使控件可滚动并不总是足够的。 ScrollViewer 知道,如果其封闭控件具有固定或最大尺寸,或者自身具有固定高度或最大高度,则它会更小,如

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

,或者它的高度(或 MaxHeight)是否绑定到适当的东西。

水平滚动条也是如此,您可以将其设置为随心所欲,如果 ScrollViewer 的宽度不受限制,则 ScrollViewer 将扩展至其内容的大小。如果滚动条可见性为“自动”,则不会显示滚动条,如果为“可见”,则会显示禁用的滚动条。 (请注意,Horizo​​ntalScrollbarVisibility 默认为“禁用”。)要获得有用的水平滚动条,请限制 ScrollViewer 的宽度将其 Horizo​​ntalScrollbarVisibility 至少设置为“Auto”。

【讨论】:

【参考方案3】:

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

【讨论】:

在您的情况下,给 ScrollViewer 一个 Padding 可能已经使其内容的空间足够小,以至于它决定现在需要滚动。但是一般情况下,如果 ScrollViewer 本身的高度没有限制,它会扩大到其内容的大小(加上潜在的 Padding)而不显示滚动条,请看下面我的回答。

以上是关于WPF Grid不显示滚动条的主要内容,如果未能解决你的问题,请参考以下文章

wpf listbox 显示不全 而且没滚动条

wpf listbox 显示不全 而且没滚动条

wpf 动态添加滚动条

WPF RichTextBox滚动条自动滚动实例文本自动滚动实例

WPF拖动DataGrid滚动条时内容混乱的解决方法

给 WPF Grid 一个 ScrollViewer 减去滚动条的宽度