C#.NET Compact Framework,自定义UserControl,焦点问题

时间:2009-10-30 08:24:13

标签: .net windows-mobile user-controls coldfusion

我有一个自定义UserControl(标签和文本框)。

我的问题是我需要处理键,键入事件以在表单(.NET Compact Framework文本框,组合框等)中的控件之间导航。使用.NET Compact Framework框架提供的控件可以正常工作,但是当我到达我编写的用户控件时,该控件无法获得焦点(文本框内部得到焦点)所以从这个用户控件我无法导航,因为在面板中我无法控制谁有焦点。

一点点模拟: Form-> Panel-> controls - >在keydown事件(使用KeyPreview)与foreach我检查哪个控件有关注面板并使用SelectNextControl传递给下一个控件,但没有人有焦点因为用户控件没有得到焦点......

我试图处理文本框的gotFocus事件并将焦点放到用户控件上,但是我得到了一个无限循环..

有人知道我该怎么办?

2 个答案:

答案 0 :(得分:7)

我们在Compact Framework上完成了同样的事情,添加了一个全局焦点管理器,支持使用键盘输入在控件之间导航。

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

编辑:为我们的递归焦点查找功能添加了代码:

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!
}

答案 1 :(得分:0)

您的面板没有任何焦点是正常的。你可以尝试的是查看你的usercontrol的任何子节点是否包含焦点。像这样:

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

如果需要,你也可以递归地遍历它们,但我不认为这是你的要求之一。