WPF数据网格行水平对齐问题

7
我在表单中使用DataGrid来显示一些数据,包括(userID, name, balances等)。但是有一个很奇怪的问题,有些行(每20行中的一行)开头会出现一个小白色空间,导致该行对齐错误。这个空白区域就像一个小矩形,放置在该行第一个单元格的前面。我检查了我的样式和其他所有东西,但是无法弄清楚为什么会发生这种情况。只有在我通过编程方式滚动DataGrid时才会出现这种情况,在滚动完成后,白色空格才会出现。

更糟糕的是,这个白色空间是可调整大小的!当我用鼠标调整它的大小时,它会破坏网格。我真的不想发布这样的东西。

我在WPF方面没有太多经验,如果有人能给我一些建议,我会非常感激。谢谢。


编辑:这里是屏幕截图:

enter image description here


1
你能发一下屏幕截图和一些代码吗?像WPF Snoop这样的工具可以帮助你找出问题所在。 - Yazan Al-Alul
太棒了!现在我正在使用它来找出这个东西是什么类型的对象! - DeveloperInToronto
2个回答

9
这个问题是由于部分随机行显示“行标题”引起的。
我不知道为什么会发生这种情况,但幸运的是解决方法很简单。
如果在DataGrid上设置RowHeaderWidth="0",行为应该符合预期。
出于某种原因,即使设置了HeadersVisibility为Column,行标题仍然会出现。

非常感谢你,彼得!你救了我!我以为我做错了什么,于是花了过去两天时间逐行检查我所有的XAML和C#代码。但我什么也没找到!这是一个非常奇怪的错误! - DeveloperInToronto
1
在我的情况下,这种行为是由于IDataErrorInfo验证略微增加了默认的RowHeader宽度以容纳红色感叹号(仅在出现错误的行上)。如果我设置RowHeaderWidth="11",它将保持不变,问题就消失了。 - Riegardt Steyn

0

我在多个项目中都遇到了同样的问题,据我所知,这只是一个普通的 bug。这真是太糟糕了。我找到的唯一解决方法也很糟糕。非常、非常糟糕。我希望我有更好的办法,但事实上并没有。无论如何,我发现当我调整网格大小时,这些奇怪的滚动伪影会消失,因此我编写了一些代码来触发引擎更新布局。

Timer _timer;

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    _timer = new Timer(1000);
    _timer.Elapsed += _timer_Elapsed;
    _timer.Start();
}

void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //why the hell are we doing this?
    //well, the stupid error adorners on the grid like to be mis-aligned
    //forcing a layout to happen makes them not look off. lame, I know.
    Dispatcher.Invoke(new Action(() =>
    {
        MainDataGrid.Margin = new Thickness(MainDataGrid.Margin.Left, MainDataGrid.Margin.Top, MainDataGrid.Margin.Right, MainDataGrid.Margin.Bottom + 1);
        MainDataGrid.UpdateLayout();

        MainDataGrid.Margin = new Thickness(MainDataGrid.Margin.Left, MainDataGrid.Margin.Top, MainDataGrid.Margin.Right, MainDataGrid.Margin.Bottom - 1);
        MainDataGrid.UpdateLayout();
    }));


}

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