我有一个自定义UserControl(标签和文本框)。
我的问题是我需要处理键,键入事件以在表单(.NET Compact Framework文本框,组合框等)中的控件之间导航。使用.NET Compact Framework框架提供的控件可以正常工作,但是当我到达我编写的用户控件时,该控件无法获得焦点(文本框内部得到焦点)所以从这个用户控件我无法导航,因为在面板中我无法控制谁有焦点。
一点点模拟: Form-> Panel-> controls - >在keydown事件(使用KeyPreview)与foreach我检查哪个控件有关注面板并使用SelectNextControl传递给下一个控件,但没有人有焦点因为用户控件没有得到焦点......
我试图处理文本框的gotFocus事件并将焦点放到用户控件上,但是我得到了一个无限循环..
有人知道我该怎么办?
答案 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;
}
如果需要,你也可以递归地遍历它们,但我不认为这是你的要求之一。