0

我有一个拆分容器。在两个面板上都有一些控件填充它们。我想确定哪个 Panel 正在持有精确的控制权。我的意思是当控制获得焦点时 - 我想知道例如 Panel1 获得焦点。是否可以在不通过事件的情况下实现?

编辑:我需要它与嵌套控件一起使用。

4

1 回答 1

1

您可以使用此代码。它返回带有焦点控件的第一个面板。不适用于嵌套控件(即 a TextBoxin a Panelin 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));
于 2012-12-18T14:58:28.667 回答