【发布时间】:2012-12-18 14:41:26
【问题描述】:
我有一个拆分容器。在两个面板上都有一些控件填充它们。我想确定哪个 Panel 正在持有精确的控制权。我的意思是当控制得到关注时 - 我想知道,例如Panel1 变得专注。是否可以在不通过事件的情况下实现?
编辑: 我需要它来处理嵌套控件。
【问题讨论】:
标签: c# winforms focus splitcontainer
我有一个拆分容器。在两个面板上都有一些控件填充它们。我想确定哪个 Panel 正在持有精确的控制权。我的意思是当控制得到关注时 - 我想知道,例如Panel1 变得专注。是否可以在不通过事件的情况下实现?
编辑: 我需要它来处理嵌套控件。
【问题讨论】:
标签: c# winforms focus splitcontainer
您可以使用此代码。它返回带有焦点控件的第一个面板。不适用于嵌套控件(即 TextBox 中的 Panel 中的 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));
【讨论】: