我有FlowLayoutPanel
我动态添加50 UserControl
。面板垂直放置,每个用户控件都有一些只读的标签。
我使用this.KeyPreview = true;
在表单中,我可以使用事件处理程序Form1_KeyUp
来捕获keyUp
事件。
在这个事件处理程序中,我捕获导航按钮↑,↓,→,←, PageUp 和 PageDown 。
单击导航按钮↑时,在面板中选择了上一个UserControl
,单击↓时,选择了下一个UserControl
。这很好用。
客户还希望能够使用我在前面提到的事件处理程序Form1_KeyUp
中捕获的 PageUp 和 PageDown 。
我希望我能找到哪些UserControl
可见。假设在面板中可以看到索引为1,2,3,4的UserControl
,那么当我单击<时使用 PageUp 和用户控制索引4时,我可以在索引1处选择用户控件KBD>下页
欢迎任何帮助。
答案 0 :(得分:2)
您可以使用此类代码:
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
属性排序的,因此第一项是容器顶部的可见项,最后一项是容器底部的可见项。
注意强>
Cast<Control>
。OfType<YourUserControl>
OrderBy(x => x.Top)
OrderByDescending(x => container.Controls.IndexOf(x))
container.ScrollControlIntoView(top);
或底部控件container.ScrollControlIntoView(bottom);
FlowLayoutPanel
AutoScroll=True
FlowDirection=TopDown
和WrapContents=False
,那么您可以使用Panel
代替,只需在添加用户控件时设置{ {1}}为他们。答案 1 :(得分:0)
如果我理解正确,这就是你的意思
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;
}
答案 2 :(得分:0)
如果你的意思是可见,可见属性是真的,请使用&#39; Shannon Holsinger&#39;回答:
如果您的意思是可以看到控件的至少一个像素,请在所有控件上循环,并使用此答案检查控件是否可见