【问题标题】:how can I enable scrollbars on the WPF Datagrid?如何在 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 scroll


【解决方案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 更有可能影响结果。当我使用 * 作为包含数据网格的行的高度时,它不起作用。
        猜你喜欢
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2014-07-23
        • 2012-11-17
        • 1970-01-01
        相关资源
        最近更新 更多