是否可以找到在 flowlayoutPanel 中可见的用户控件
Is it possible to find which userControl are visible in a flowlayoutPanel
我有一个 FlowLayoutPanel
,我动态添加了 50 UserControl
。面板垂直放置,每个用户控件都有一些只读标签。
我用this.KeyPreview = true;
在表单中,这样我就可以使用事件处理程序 Form1_KeyUp
来捕获 keyUp
事件。
在此事件处理程序中,我捕获了导航按钮 ↑、↓、→、←、PageUp 和 PageDown.
当我点击导航按钮 ↑ 前一个 UserControl
在面板中 select 并且当点击 ↓ 下一个 UserControl
是 selected。这个效果不错。
客户还希望能够使用 PageUp 和 PageDown,我在事件处理程序 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);
使顶部控件进入视图
- 如果你有一个
FlowLayoutPanel
与 AutoScroll=True
和 FlowDirection=TopDown
和 WrapContents=False
那么你可以使用 Panel
代替,只是在添加用户控件时,为他们设置Dock=Top
。
我有一个 FlowLayoutPanel
,我动态添加了 50 UserControl
。面板垂直放置,每个用户控件都有一些只读标签。
我用this.KeyPreview = true;
在表单中,这样我就可以使用事件处理程序 Form1_KeyUp
来捕获 keyUp
事件。
在此事件处理程序中,我捕获了导航按钮 ↑、↓、→、←、PageUp 和 PageDown.
当我点击导航按钮 ↑ 前一个 UserControl
在面板中 select 并且当点击 ↓ 下一个 UserControl
是 selected。这个效果不错。
客户还希望能够使用 PageUp 和 PageDown,我在事件处理程序 Form1_KeyUp
中将其捕获为我之前提到过。
我希望我能找到哪些 UserControl
是可见的。假设索引为 1、2、3、4 的 UserControl
在面板中可见,那么当我使用 PageUp 和用户控件时,我可以在索引 1 处 select 用户控件当我单击 PageDown.
欢迎任何帮助。
如果我没理解错的话,这就是你的意思
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>
. 而不是 - 您可以使用
OrderByDescending(x => container.Controls.IndexOf(x))
而不是 - 您可以使用
container.ScrollControlIntoView(top);
或底部控件container.ScrollControlIntoView(bottom);
使顶部控件进入视图
- 如果你有一个
FlowLayoutPanel
与AutoScroll=True
和FlowDirection=TopDown
和WrapContents=False
那么你可以使用Panel
代替,只是在添加用户控件时,为他们设置Dock=Top
。
Cast<Control>
OrderBy(x => x.Top)