如何在WPF数据网格上启用滚动条?

74
当我运行以下来自这篇文章Northwind WPF Toolkit Datagrid代码时,虽然会出现一个数据表格,但却没有滚动条,因此用户只能看到部分数据。我正在使用最新版本(即2009年3月版)。 我需要指定什么才能让WPF Datagrid出现滚动条? 我尝试将数据表格放在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的重复问题。 - NoWar
7个回答

115

DataGrid放在GridDockPanelContentControl或直接在Window中。一个垂直方向的StackPanel会给它的子元素他们请求的任何垂直空间,即使这意味着它不可见。


1
此外,HeaderedContentControl 内部使用 StackPanel 实现,这将导致 DataGrid 的行为与 ContentControl 不一致。 - user7116
7
我一直认为这个建议无用,直到我最终发现了隐藏在我的XAML顶部的StackPanel标记。谢谢! - Ted
2
同时,拥有一个垂直方向的Stackpanel将会阻碍虚拟化并影响应用程序性能。 - kiran
4
同时,如果将DataGrid放置在Grid行中,请勿使用“Auto”,因为这样会允许datagrid扩展到屏幕外部--且没有滚动条。要显示滚动条,必须明确地给DataGrid指定大小--例如使用*或数字。 - Alan Wayne

62

WPF4

->

WPF4

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

使用 <ColumnDefinition Width="350" /><RowDefinition Height="300" /> 可以正常工作。

当使用 <ColumnDefinition Width="Auto" /><RowDefinition Height="300" /> 时,滚动条不会显示。

如果在外部有一个 <Grid> 的情况下嵌套,则 <ColumnDefinition Width="*" /><RowDefinition Height="300" /> 也可以正常工作。


4
ScrollViewer 是一个附加属性。 - xmedeko

25

如果任何父容器的RowDefinition高度设置为"Auto",也会阻止滚动条出现。

或者您可以将高度设置为"*"

这在我的情况下发生了。


21

DataGridMaxHeightVerticalScrollBarVisibility="Auto"属性添加上去解决了我的问题。


2
是的,这很有效。完美地解决了我的问题。谢谢~ - Bravo Yeung
3
我个人认为这是最佳答案。 - Sachin Kainth

4

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


如果您喜欢使用StackPanel,那么可以这样做。只需定义DataGrid的高度即可。无需将其包含在ScrollViewer中,因为这样会出现两个滚动条,这可能不是您想要的。<StackPanel><DataGrid Height="300"/></StackPanel> - H2ONaCl

1
在我的情况下,我必须设置MaxHeight并将IsEnabled="False"替换为IsReadOnly="True"

0

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

<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>

我不知道为什么像这样一个简单的解决方案会被踩 - 我可以确认,这个简单的(没有乱七八糟和复杂的东西)对我来说完美地运行 - 谢谢! - Christian Casutt
2
@ChristianCasutt 因为仅仅通过观察,很可能是TabItem影响了结果。当我在包含DataGrid的行上使用*作为高度时,它不起作用。 - Dan Rayson

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