【问题标题】:Detect SplitContainer's active Panel (Visual C# Express 2010, WinForms)检测 SplitContainer 的活动面板(Visual C# Express 2010,WinForms)
【发布时间】:2012-12-18 14:41:26
【问题描述】:

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

编辑: 我需要它来处理嵌套控件。

【问题讨论】:

    标签: c# winforms focus splitcontainer


    【解决方案1】:

    您可以使用此代码。它返回带有焦点控件的第一个面板。不适用于嵌套控件(即 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));
    

    【讨论】:

    • 这是一个不错的解决方案,但我需要它来实现嵌套控件。如果没有解决方案出现,我会将其标记为最接近我需要的解决方案。
    • 那真是太好了。唯一的问题是,我猜它必须由全局应用点击事件触发,所以每次点击都会暗示迭代通过所有 SplitterPanel 的孩子。但这仍然是一个很好的解决方案。谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多