C#.NET Compact Framework中,自定义用户控件,焦点问题(C# .NET Com

2019-09-02 12:17发布

我有一个自定义用户控件(标签和文本框)。

我的问题是我需要处理按键后,键上的活动形式(控件之间导航.NET Compact Framework的文本框,组合框等)。 由.NET Compact Framework的框架它的工作原理,但是当我到达我写一个用户控件,控制不`吨获得焦点(文本框里面获得焦点),所以从这个用户控件,我不能因为在面板导航提供的控件我没有的谁具有焦点任何控制。

有一点模拟了:形式 - >面板 - >控制 - >与一个foreach我检查什么控制都在面板上的焦点,并通过与SelectNextControl下一控制keydown事件(使用的KeyPreview),但没有人有焦点,因为该用户控件不`吨有重点...

我试图处理文本框GotFocus事件,并把焦点转移到用户的控制,但我得到了一个无限循环..

是否有人有任何想法,我能做些什么?

Answer 1:

我们已经做了精简框架完全一样的事情,并称支持使用键盘输入控件之间的导航成为全球焦点经理。

基本上,你需要做的是,直到找到具有焦点的控制递归下降的控件树。 这不是非常有效的,但只要你只能做一次每关键事件,它不应该是一个问题。

编辑:添加的代码为我们递归聚焦引入功能:

public static Control FindFocusedControl(Control container)
{
    foreach (Control childControl in container.Controls) {
        if (childControl.Focused) {
            return childControl;
        }
    }

    foreach (Control childControl in container.Controls) {
        Control maybeFocusedControl = FindFocusedControl(childControl);
        if (maybeFocusedControl != null) {
            return maybeFocusedControl;
        }
    }

    return null; // Couldn't find any, darn!
}


Answer 2:

这是正常的,你的面板没有收到任何焦点。 你可以尝试是看,如果你的用户控件的所有子包含焦点。 事情是这样的:

bool ContainsFocus(Control lookAtMe) {
 if (lookAtMe.Focused) return true;
 else {
     foreach (Control c in lookAtMe.Controls) {
         if (c.Focused) return true;
     }
 }
 return false;
}

您还可以递归遍历他们,如果这是必要的,但我不认为这是您在此处的要求之一。



文章来源: C# .NET Compact Framework, custom UserControl, focus issue