2015-11-06 2 views
0

Я недавно занимался разработкой игр и получил доступ к Microsoft XNA4.0 (Monogame соответственно). К сожалению, XNA на самом деле не поставляется с инструментарием пользовательского интерфейса, поэтому я начал писать его сам (я знаю, что там есть много сторонних инструментов, но для образовательных целей я решил заново изобрести колесо).Ввод устройства управления и фокус в UI

Мой вопрос: как интерфейс UI управляет и управляет вводом устройств, особенно в отношении фокусировки? Скажем, у меня есть абстракция управляемых событий над физической клавиатурой, которая состояние опрашиваемой с помощью простого цикла:

public interface IKeyboard { 
    event EventHandler<Keys> KeyPressed; 
    void Update(); 
} 

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

Возможных решений будут:

  • Управления состояния фокусировки в каждом управлении и обрабатывать только входные данные в элементе управления, который в настоящее время ориентирован

или ...

  • Processing ввод от централизованного менеджера и отправка его только на сфокусированное управление

Как делают существующие инструменты пользовательского интерфейса, такие как WPF или Winforms? Индивидуальные элементы управления там кажутся такими .. развязанными, но каждый элемент управления должен знать о сосредоточенном в данный момент.

ответ

0

В моем решении у меня есть класс UIControl для управления, UIPanel и UIForm на основе UIControl и interfce IFocusable. Если управление IFocusable, оно может иметь фокус ввода. Если панель управления - панель, она может управлять фокусом для своих дочерних элементов управления. У вас может быть одна активная форма или обновление за одно и то же время, но внутри каждой формы у вас есть только одно сфокусированное управление. Если этот элемент управления является контейнером элементов, он также имеет только одно сфокусированное управление. Когда пользователь запрашивает ключ только сфокусированного управления (это когда-либо есть), узнайте об этом.

Я не хочу вырезать части кода. Если вы хотите, вы можете увидеть весь sources.

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