是否有可能找到在flowlayoutPanel中可见的userControl ?

本文关键字:userControl flowlayoutPanel 有可能 是否 | 更新日期: 2023-09-27 18:07:02

我有一个动态添加50个UserControlFlowLayoutPanel。面板垂直放置,每个用户控件都有一些只读标签。

我用this.KeyPreview = true;以便我可以使用事件处理程序Form1_KeyUp来捕获keyUp事件。在这个事件处理程序中,我捕获了导航按钮PageUpPageDown

当我点击导航按钮上一个UserControl在面板中被选中,当点击下一个UserControl被选中。

客户还希望能够使用PageUpPageDown,这是我在事件处理程序Form1_KeyUp中捕获的。

我希望我能找到哪些UserControl是可见的。假设索引1,2,3,4的UserControl在面板中可见,那么当我使用PageUp时,我可以选择索引1的用户控制,当我单击PageDown时,可以选择索引4的用户控制。

欢迎任何帮助

是否有可能找到在flowlayoutPanel中可见的userControl ?

您可以使用这样的代码:

var controls = container.Controls.Cast<Control>().OrderBy(x => x.Top);
var visibles = controls.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds));
var top = visibles.FirstOrDefault();
var bottom = visibles.LastOrDefault();

在上面的代码中,我首先按Top排序容器的控件。然后使用IntersectsWith,我发现这些控件,他们的边界有交集的客户端矩形的容器,这意味着这些控件是可见的。

由于列表是按照控件的Top属性排序的,所以第一个项目是位于容器顶部的可见项目,最后一个项目是位于容器底部的可见项目。

注意

  • 可以用OfType<YourUserControl>代替Cast<Control>
  • 可以用OrderByDescending(x => container.Controls.IndexOf(x))
  • 代替OrderBy(x => x.Top)
  • 您可以使用container.ScrollControlIntoView(top);container.ScrollControlIntoView(bottom);将顶部控件带入视图
  • 如果您有FlowLayoutPanelAutoScroll=TrueFlowDirection=TopDownWrapContents=False,那么您可以使用Panel代替,只是在添加用户控件时,为它们设置Dock=Top

如果我没理解错的话,这就是你的意思

 public List<Control> GetvisibleControls(Control parent)
            {
                List<Control> returnList = new List<Control>();
                foreach(Control child in parent.Controls)
                {
                    if (child.Location.X < parent.Width && child.Location.Y < parent.Height)
                        returnList.Add(child);
                }
                return returnList;
            }

如果visible是指可见属性为真,请使用Shannon Holsinger的回答:

如果你的意思是至少可以看到一个控件的像素,循环所有控件,并使用这个答案来检查控件是否可见

c# winform检查控件是否可见