2009-10-30 4 views
2

У меня есть пользовательский UserControl (метка и текстовое поле).C# .NET Compact Framework, пользовательский UserControl, проблема с фокусом

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

Небольшой макет: Form-> Panel-> controls -> on keydown event (с помощью KeyPreview) с foreach Я проверяю, какой элемент управления имеет фокус на панели и переходит к следующему элементу управления с помощью SelectNextControl, но никто иметь фокус, потому что UserControl Don `T получил фокус ...

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

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

ответ

7

Мы сделали то же самое на Compact Framework, добавив глобальный диспетчер фокуса, который поддерживает навигацию между элементами управления с использованием ввода с клавиатуры.

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

Edit: Добавлен код для нашей функции нахождения рекурсивного фокуса:

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

Спасибо! (нужно больше пяти символов из системы, чтобы добавить комментарий) – Alex

+0

Сладкий ответ. Это один из немногих надежных способов получить фокус. – Vaccano

+0

зачем повторять контроль дважды? – mauris

0

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

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

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

Смежные вопросы