如何在 WPF Datagrid 上启用滚动条?

Posted

技术标签:

【中文标题】如何在 WPF Datagrid 上启用滚动条?【英文标题】:how can I enable scrollbars on the WPF Datagrid? 【发布时间】:2010-10-14 23:35:39 【问题描述】:

当我从this article 运行以下 Northwind WPF Toolkit Datagrid 代码时,我得到了一个数据网格,但没有没有滚动条,因此用户只能看到部分的数据网格。我使用的是 2009 年 3 月的最新版本。

我需要指定什么以使 WPF 数据网格具有滚动条?

我尝试将数据网格放在 ScrollViewer 中,但没有帮助。

XAML:

<Window x:Class="TestDataGrid566.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Window1" Height="600" Width="800">
    <StackPanel>
        <toolkit:DataGrid x:Name="TheDataGrid" AutoGenerateColumns="True"/>
    </StackPanel>
</Window>

代码隐藏:

using System.Linq;
using System.Windows;
using TestDataGrid566.Model;

namespace TestDataGrid566

    public partial class Window1 : Window
    
        public Window1()
        
            InitializeComponent();

            NorthwindDataContext db = new NorthwindDataContext();
            var customers = from c in db.Customers
                            select c;
            TheDataGrid.ItemsSource = customers;
        
    

【问题讨论】:

WPF Datagrid - Not showing any Scrollbar的可能重复 【参考方案1】:

DataGrid 放入GridDockPanelContentControl 或直接放入Window。一个垂直方向的StackPanel 将给它的孩子他们要求的任何垂直空间——即使这意味着它被渲染在视野之外。

【讨论】:

除此之外,HeaderedContentControl 在内部使用StackPanel 实现,这将导致DataGrid 的行为方式与ContentControl 不一致。 我认为这个建议是垃圾几个小时,直到我终于发现 StackPanel 标记潜伏在我的 XAML 顶部看不见。谢谢! 还有一个垂直方向的 Stackpanel 会阻碍虚拟化并影响应用程序性能。 另外,如果 DataGrid 放置在 Grid Row 中,请不要使用“Auto”,因为这将允许数据网格在屏幕外展开——没有滚动条。要显示滚动条,必须为 DataGrid 明确指定大小——如 * 或数字。【参考方案2】:

WPF4

<DataGrid AutoGenerateColumns="True" Grid.Column="0" Grid.Row="0"
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto"
      ScrollViewer.HorizontalScrollBarVisibility="Auto">
</DataGrid>

with : &lt;ColumnDefinition Width="350" /&gt; & &lt;RowDefinition Height="300" /&gt; 工作正常。

滚动条不显示&lt;ColumnDefinition Width="Auto" /&gt; & &lt;RowDefinition Height="300" /&gt;

也适用于:&lt;ColumnDefinition Width="*" /&gt; & &lt;RowDefinition Height="300" /&gt; 如果 this 嵌套在外部 &lt;Grid&gt; 中。

【讨论】:

@Konrad Viltersten ScrollViewer 是附加属性。【参考方案3】:

如果任何父容器 RowDefinition 高度设置为 "Auto" 也是滚动条的停止器

您也可以设置高度“*”

这发生在我的案例中。

【讨论】:

【参考方案4】:

DataGrid 上添加MaxHeightVerticalScrollBarVisibility="Auto" 解决了我的问题。

【讨论】:

是的,这很有效。完美解决了我的问题。谢谢~ 以我的拙见为最佳答案。【参考方案5】:

为列和行添加具有定义的高度和宽度的网格。然后添加ScrollViewer 并在其中添加dataGrid。

【讨论】:

【参考方案6】:

就我而言,我必须设置 MaxHeight 并将 IsEnabled="False" 替换为 IsReadOnly="True"

【讨论】:

【参考方案7】:

这对我有用。 关键是使用 * 作为行高。

<Grid x:Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition Height="60"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="10"/>
        </Grid.RowDefinitions>

        <TabControl  Grid.Row="1" x:Name="tabItem">
                <TabItem x:Name="ta" 
                        Header="List of all Clients">
                        <DataGrid Name="clientsgrid" AutoGenerateColumns="True" Margin="2" 
                         ></DataGrid>
                </TabItem>
        </TabControl>
    
    </Grid>

【讨论】:

我不知道为什么像这样的简单解决方案被否决 - 我可以确认,这个简单(没有 bla bla 和复杂的东西)非常适合我 - 谢谢! @ChristianCasutt 因为只看它,TabItem 更有可能影响结果。当我使用 * 作为包含数据网格的行的高度时,它不起作用。

以上是关于如何在 WPF Datagrid 上启用滚动条?的主要内容,如果未能解决你的问题,请参考以下文章

如何在wpf treeview控件上启用平滑滚动

如何在 WPF 数据网格上自动滚动

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

WPF 在datagrid和ScrollViewer的滚动条上右键发现弹出的选项全是英文,怎么改成汉语?

WPF DataGrid:如何在单击单元格时停止自动滚动?

WPF实现两个DataGrid列表的滚动条同步