gpt4 book ai didi

c# - DataGrid 中的可见行减少 1(使用 ContainerFromItem 计算)

转载 作者:行者123 更新时间:2023-11-30 14:54:20 29 4
gpt4 key购买 nike

我有一个可变尺寸的 DataGrid 取决于屏幕分辨率。我需要知道有多少行对用户可见。这是我的代码:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);
if(Row != null && Row.IsVisible) {
VisibleRows++;
}
}

我正在使用以下代码来测试变量:

MessageBox.Show(String.Format("{0} of {1} rows visible", VisibleRows, TicketGrid.Items.Count));
  • 当网格中没有行时,它会正确显示 0 行中的 0 行可见:

  • 当网格中有 1 行时,它会正确显示 1 行中的 1 行可见:

  • 当网格中有 9 行时,它会正确显示 9 行中的 9 行可见:

  • 下一行是“半可见”,所以我将其显示 10 行中的 10 行 视为正确:

  • 然而,要添加的下一行显然是可见的,错误地显示了 11 行中的 11 行可见:

  • 在此之后添加的行是正确的(除了杂散的 1),例如18 行中的 11 行可见:


我不能只是 - 1,因为只有在添加了某个数字后它才不正确。我无法检查 > 10,因为维度是可变的。

我该如何解决这个问题?

最佳答案

这是最终对我有用的东西:

uint VisibleRows = 0;
var TicketGrid = (DataGrid) MyWindow.FindName("TicketGrid");

foreach(var Item in TicketGrid.Items) {
var Row = (DataGridRow) TicketGrid.ItemContainerGenerator.ContainerFromItem(Item);

if(Row != null) {
/*
This is the magic line! We measure the Y position of the Row, relative to
the TicketGrid, adding the Row's height. If it exceeds the height of the
TicketGrid, it ain't visible!
*/

if(Row.TransformToVisual(TicketGrid).Transform(new Point(0, 0)).Y + Row.ActualHeight >= TicketGrid.ActualHeight) {
break;
}

VisibleRows++;
}
}

直到第 9 行(包括第 9 行)显示 9 个中的 9 个可见。 “半可见”第 10 行导致 10 个中有 9 个可见。实际上,为了我的目的,将此 not 算作可见行更好,所以这对我来说就可以了! :)

注意:如果您使用break 重用我的代码,则违规行之后的任何不可见行都将抛出NullRefException

关于c# - DataGrid 中的可见行减少 1(使用 ContainerFromItem 计算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548360/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com