我有一个SplitContainer。在两个面板上,都有一些控件填充它们。我想确定哪个小组持有直接集中的控制权。我的意思是当控制得到焦点时 - 我想知道例如 Panel1 得到了焦点。这有可能在不通过事件的情况下实现吗?
编辑:我需要它与嵌套控件一起使用。
您可以使用
此代码。它返回具有焦点控件的第一个面板。不适用于嵌套控件(即SplitterPanel
中Panel
中的TextBox
)。
var panels = splitContainer1.Controls.OfType<SplitterPanel>();
var focusedPanel = panels.FirstOrDefault(p => p.Controls.OfType<Control>().
Any(c => c.Focused));
编辑:要支持递归子检测,您可以使用此方法:
static IEnumerable<Control> GetNestedChildren(Control container)
{
var children = container.Controls.OfType<Control>().ToArray();
return children.Concat(children.SelectMany(GetNestedChildren));
}
你以前的代码将变成:
var panels = splitContainer1.Controls.OfType<SplitterPanel>();
var focusedPanel = panels.
FirstOrDefault(p => GetNestedChildren(p).
Any(c => c.Focused));