2016-01-29 1 views
0

У меня есть форма под названием «MainView», которая содержит UserControl под названием «GameState» (я использую конечный автомат). В «UserStation» GameState я рисую игровой мир. У меня также есть событие KeyUp в «GameState», в котором будет показан UserControl «InGameMenu» в UserControl GameState (InGameMenu.visible = true), когда будет нажата Escape.C# WinForms ключевые события, не работающие при показе дочернего элемента управления

Когда я нажимаю Escape, появляется меню. Если снова нажать Escape, меню снова скрывается. После щелчка по меню я не могу повторить ключевые события из «GameState» и «InGameMenu». Сначала я подумал, что это была простая проблема с фокусировкой, поэтому я попытался щелкнуть «GameState» и «InGameMenu», чтобы проверить, не запустили ли ключевые события, но этого не произошло. Я также попытался добавить ключевое событие из «GameState» в обработчик события «InGameMenu» или обработать ключевые события в «InGameMenu», но это тоже не сработало (ни один не запущен). У меня есть кнопка «InGameMenu». Когда я нажимаю, что меню скрывается, и ключевые события из «GameState» снова работают.

Почему ключевые события из «GameState» и «InGameMenu» не срабатывают при открытии «InGameMenu»?

Заранее спасибо.

GameState Код

public partial class GameState : UserControl, IState<MainView> 
{ 
    private bool ready = false; 
    private Font drawFont = new Font("Arial", 16); 
    private SolidBrush drawBrush = new SolidBrush(Color.Black); 

    private InGameMenu menu; 

    public GameState() 
    { 
     InitializeComponent(); 
     this.menu = new InGameMenu(); 
     this.menu.Location = new Point(this.Width/2 - menu.Width/2, this.Height/2 - menu.Height/2); 
     this.menu.Visible = false; 
     this.addControl(this.menu);  
    } 

    public void addControl(Control control) 
    { 
     control.KeyUp += this.GameState_KeyUp; 
     this.Controls.Add(control); 
    } 

    public void enter(MainView owner) 
    { 
     this.Width = owner.Width; 
     this.Height = owner.Height; 
     this.Location = new Point(0, 0); 
     owner.Controls.Add(this); 
     World.getInstance().createWorld(); 
     this.Focus();  

     this.ready = true; 
    } 

    public void update(MainView owner) 
    { 
     //game stuff 
     if (this.menu.Visible == false) 
     { 
      //game stuff 
     } 
     else 
     { 
      switch (this.menu.action) 
      { 
       case action.stop: 
        owner.stateMachine.setCurrentState(new MainMenuState()); 
        break; 
       case action.close: 
        this.menu.Visible = false; 
        this.Focus(); 
        break; 
       default: 
        break; 
      } 
      this.menu.action = action.nothing; 
     }  

    } 

    private void GameState_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Escape) 
     { 
      if (this.menu.Visible == false) 
      { 
       this.menu.Visible = true; 
      } 
      else 
      { 
       this.menu.Visible = true; 
      } 
     } 
    } 

} 

InGameMenu Код

namespace LordsAndLands.States.GameStateStuff 
{ 
public enum action 
{ 
    nothing, 
    stop, 
    close 
} 

public partial class InGameMenu : UserControl 
{ 
    public action action = action.nothing; 

    public InGameMenu() 
    { 
     InitializeComponent(); 
    } 

    private void buttonExit_Click(object sender, EventArgs e) 
    { 
     Environment.Exit(0); 
    } 

    private void buttonExitToMainMenu_Click(object sender, EventArgs e) 
    { 
     this.action = action.stop; 
    } 

    private void buttonClose_Click(object sender, EventArgs e) 
    { 
     this.action = action.close; 
    } 

} 
} 
+0

События клавиатуры поднимаются на элемент управления, который имеет фокус. UserControl действительно, * действительно * не любит получать фокус (он не имеет возможности указать его) и делает все возможное, чтобы передать фокус одному из своих клиентских элементов управления. Он не может этого сделать, когда его еще нет. Но это исправлено, когда вы вызвали this.Controls.Add(). Переопределите ProcessCmdKey(), чтобы увидеть быстрые нажатия клавиш перед тем, как элемент управления видит их. –

+0

Я переопределил ProcessCmdKey и сейчас обрабатываю ключевые события. Это то, что вы имели ввиду? Это похоже на обходной путь. –

ответ

0

Вы можете использовать Form.KeyPreview=true; свойство формы и проверки в случае формы, какой ключ нажать и какие другие элементы управления должны делать.

KeyPreview свойства:

Получает или задает значение, указывающее, будет ли форма получить ключевые события до события передается в управление, которое имеет фокус.

Подробнее о MSDN.

+0

Я не обрабатываю ключевые события в форме, но в UserControl «GameState», который является элементом формы «MainView», –

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