【发布时间】:2017-01-13 21:55:27
【问题描述】:
您好,我有一个问题。
我有一个Panel,其中包含例如 1000 个Label 控件,每个标签的高度在 Windows 窗体应用程序中是可变的,我将找到滚动面板时在面板中看到的第一个标签的位置垂直。
这是我的Panel 和Label 控件的屏幕截图:
【问题讨论】:
您好,我有一个问题。
我有一个Panel,其中包含例如 1000 个Label 控件,每个标签的高度在 Windows 窗体应用程序中是可变的,我将找到滚动面板时在面板中看到的第一个标签的位置垂直。
这是我的Panel 和Label 控件的屏幕截图:
【问题讨论】:
您可以遍历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 找到并且至少是10 pixels 高.. 修改以适合您的数字!
您可以在需要时调用该函数..:
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。
【讨论】: