WPF工具包DataGrid - 行重叠(行高问题)

时间:2010-03-01 09:57:49

标签: c# .net wpf datagrid wpftoolkit

我有一个DataGrid,其中包含一些包含另一个DataGrid的模板列。我的问题是,如果某些行中有很多内容,它们的高度不会调整,因此整个内容都是可见的,而是它被切断,给人的印象是行重叠。但是,只要我向网格添加一个新行或向主网格行之一的迷你网格中添加一个新行,就会更新布局并正确调整行高。

所以问题只出在第一次加载网格时。

有没有办法强制网格将行高增加到内容大小?

由于

5 个答案:

答案 0 :(得分:1)

今天我遇到了一些严重的问题(错误?),所以我会分享我尝试过的和几乎有用的东西......(希望有人知道实际修复)

在我的情况下,只有当有10行或更多行时才会出现错误。在行中,十个第一行在某些情况下对于内容具有太小的高度。 (我首先想到的是,九个项目是相互叠加的,这对我来说很愚蠢。)有很多列,所以有一个滚动条。单击滚动条可将高度调整为适当的值。

根据我的经验,有些事情不起作用:

  • 更改虚拟化设置无效。
  • InvalidateVisual()和InvalidateArrange()不起作用。尝试了datagrid及其父级。
  • 更改datagrid的高度不起作用(虽然我对这里的测试不太满意)
  • 强制将单元格的数据模板设置为特定大小没有效果。
  • 将数据网格放置在scrollviewer中(以便数据网格可以拥有它可能需要的所有空间......)不起作用。

然而:

数据网格似乎尊重的一件事(我发现)是MinRowHeight设置,所以现在我已经有了一个moronic值,我希望以后不会在修改datatemplates时导致问题

答案 1 :(得分:1)

我遇到了.NET Framework 4.0附带的DataGrid的相同错误。 在某些情况下(没有水平滚动条,窗口大于特定大小,......)行没有正确显示但放在另一个上面(有一个小偏移),所以只有最后一行是完全可见的。

首先,我尝试在DataGrid中填充行后自动执行UI操作,因此更新了布局。但后来我发现,您可以使用调度程序重新呈现控件,在我的情况下,最终修复了错误。

我的整个代码更改基本上就是这个(填写DataGrid之后):

Action emptyAction = delegate() { };
myDataGrid.Dispatcher.Invoke(DispatcherPriority.Render, emptyAction);

答案 2 :(得分:0)

我不确定这是什么,但是一段时间之后,当加载元素时,你可以尝试调用InvalidateVisual()。这迫使完成新的布局传递......

答案 3 :(得分:0)

我的UserControl中的DataGrid正在做同样的事情。在此示例中,只有32行数据,其中五个DataGridTemplateColumns由< Image>组成。和四个< TextBlock> s。

我的控件显示搜索结果,如果我重新运行相同的搜索,它并不总是这样做。此外,裁剪仅在第一页结果上发生。行进一步下来就可以了。

使用InvalidateVisual()无济于事。

如果有人对如何解决这个问题有任何想法,或者可以表明这是否是该控件的已知问题,我会有兴趣听到它。

答案 4 :(得分:0)

在我的情况下,我只需要在循环添加额外内容之前添加第一行。

我想要4列和 n 这样的行:

    private void InitToList() {
        Grid wp = new Grid();
        wp.Margin = new Thickness(0);
        wp.ColumnDefinitions.Add(new ColumnDefinition());
        wp.ColumnDefinitions.Add(new ColumnDefinition());
        wp.ColumnDefinitions.Add(new ColumnDefinition());
        wp.ColumnDefinitions.Add(new ColumnDefinition());
        wp.RowDefinitions.Add(new RowDefinition());  // adding this fixed the overlapping

        int curCol = 0;
        int curRow = 0;
        foreach (string name in toIds) {
            if (curCol >= wp.ColumnDefinitions.Count()) {
                wp.RowDefinitions.Add(new RowDefinition());
                curCol = 0;
                curRow++;
            }
            CheckBox cb = new CheckBox();
            cb.Name = String.Format("{0}Check", name.ToLower().Replace(" ", ""));
            cb.IsChecked = false;
            cb.Margin = new Thickness(5, 5, 5, 5);
            cb.Content = name;

            Grid.SetColumn(cb, curCol);
            Grid.SetRow(cb, curRow);
            wp.Children.Add(cb);
            curCol++;
        }