滚动期间如何在自动滚动面板中找到第一个可见标签

How to find the first visible Label in an autoscroll Panel during scroll

你好,我有一个问题。 我有一个 Panel,其中包含例如 1000 个 Label 控件,每个标签的高度在 Windows 表单应用程序中是可变的,我将找到第一个标签的位置垂直滚动面板时在面板中看到。

这是我的 PanelLabel 控件的屏幕截图:

您可以遍历 Controls 集合,直到找到 Label:

Label getTopLabel(Panel container)
{
    for (int y = 0; y < 60; y+= 10)
    {
        Label lbl = (Label)container.GetChildAtPoint(new Point(20, y));
        if (lbl != null) return lbl;
    }
    return null;
}

我的示例假设两个 Labels 之间的间隙不大于 60 像素,并且所有 Labels 都可以在 X=20 处找到并且至少 [=18] =] 高..修改以适合您的数字!

您可以随时调用该函数..:[=​​19=]

private void panel1_Scroll(object sender, ScrollEventArgs e)
{
    Control ctl = getTopLabel(panel1);
    if (ctl != null) Text = ctl.Name;
}

无论大小和距离如何,您都可以在容器 Panel 中找到顶部 Label 控件:

private void container_Scroll(object sender, ScrollEventArgs e)
{
    var labels = container.Controls.OfType<Label>().OrderBy(x => x.Top);
    var top = labels.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds))
                    .FirstOrDefault();
    if (top != null)
    {
        this.Text = top.Name;
        top.BackColor = Color.Gold;
        labels.Except(new[] { top }).ToList().ForEach(x => x.BackColor = Color.Silver);
    }
}

在上面的代码中,我首先根据标签Top对标签进行了排序,然后我得到了第一个与容器面板绑定的标签。

要查找顶部项目的位置,找到它后,使用top.Location