【问题标题】:How to find the first visible Label in an autoscroll Panel during scroll滚动期间如何在自动滚动面板中找到第一个可见标签
【发布时间】:2017-01-13 21:55:27
【问题描述】:

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

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

【问题讨论】:

    标签: c# winforms panel


    【解决方案1】:

    您可以遍历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;
    }
    

    【讨论】:

    • 哦! TaW 此代码仅适用于滚动,但当我单击向上或向下时它不起作用
    • 什么是“向上”和“向下”?另外:您可以轻松地将其转换为函数并随时调用它..
    • 感谢您的解决方案权利 权利与您同在(您的解决方案还可以)
    【解决方案2】:

    无论大小和距离如何,都可以通过这种方式在容器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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      相关资源
      最近更新 更多