是否可以找到在 flowlayoutPanel 中可见的用户控件

Is it possible to find which userControl are visible in a flowlayoutPanel

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

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

当我点击导航按钮 前一个 UserControl 在面板中 select 并且当点击 下一个 UserControl 是 selected。这个效果不错。

客户还希望能够使用 PageUpPageDown,我在事件处理程序 Form1_KeyUp 中将其捕获为我之前提到过。

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

时在索引 4

欢迎任何帮助。

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

 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;
            }

如果您的意思是可见,可见 属性 为真,请使用 'Shannon Holsinger' 答案:

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

C# winform check if control is physicaly visible

你可以使用这样的代码:

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