C # .NET Compact Framework, пользовательский UserControl, фокус проблемы - PullRequest
2 голосов
/ 30 октября 2009

У меня есть собственный UserControl (метка и текстовое поле).

Моя проблема заключается в том, что мне нужно обрабатывать события нажатия клавиши вверх и вверх, чтобы перемещаться между элементами управления в форме ( .NET Compact Framework текстовое поле, поле со списком и т. Д.). С элементами управления, предоставляемыми платформой .NET Compact Framework, она работает, но когда я достигаю пользовательский элемент управления, написанный мной, этот элемент управления не получает фокус (текстовое поле внутри получает фокус), поэтому из этого пользовательского элемента управления я не могу перемещаться, потому что на панели Я не имею никакого контроля над тем, у кого есть фокус.

Немного макет: Форма-> Панель-> Элементы управления -> по событию keydown (используя KeyPreview) с foreach Я проверяю, какой элемент управления имеет фокус на панели, и перехожу к следующему элементу управления с помощью SelectNextControl, но никто не фокусируется, потому что элемент управления user не контролируется ...

Я попытался обработать текстовое поле gotFocus и перенести фокус на пользовательский элемент управления, но получил бесконечный цикл ..

Кто-нибудь знает, что я могу сделать?

Ответы [ 2 ]

7 голосов
/ 30 октября 2009

Мы сделали то же самое на 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!
}
0 голосов
/ 30 октября 2009

Это нормально, что ваша панель не получает никакого фокуса. То, что вы можете попробовать, это посмотреть, содержит ли фокус дочерние элементы вашего usercontrol. Примерно так:

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

Вы также можете проходить их рекурсивно, если это необходимо, но я не думаю, что это одно из ваших требований здесь.

...