我有一个拆分容器。在两个面板上都有一些控件填充它们。我想确定哪个 Panel 正在持有精确的控制权。我的意思是当控制获得焦点时 - 我想知道例如 Panel1 获得焦点。是否可以在不通过事件的情况下实现?
编辑:我需要它与嵌套控件一起使用。
我有一个拆分容器。在两个面板上都有一些控件填充它们。我想确定哪个 Panel 正在持有精确的控制权。我的意思是当控制获得焦点时 - 我想知道例如 Panel1 获得焦点。是否可以在不通过事件的情况下实现?
编辑:我需要它与嵌套控件一起使用。
您可以使用此代码。它返回带有焦点控件的第一个面板。不适用于嵌套控件(即 a TextBox
in a Panel
in a SplitterPanel
)。
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));