2009-06-08 2 views
4

У меня есть несколько текстовых полей в моем пользовательском интерфейсе, которые я хочу отобразить на клавиатуре для мобильных устройств, когда элемент управления имеет фокус, а затем уйдите..net cf TextBox, который отображает клавиатуру в фокусе

Примечание: для этой конкретной программы это высокий экран и не имеет физической клавиатуры на устройстве.

ответ

13

Добавить InputPanel в форму, подключить события GotFocus и LostFocus на TextBox и показать/скрыть панель ввода в обработчики событий:

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    SetKeyboardVisible(true); 
} 

private void TextBox_LostFocus(object sender, EventArgs e) 
{ 
    SetKeyboardVisible(false); 
} 

protected void SetKeyboardVisible(bool isVisible) 
{ 
    inputPanel.Enabled = isVisible; 
} 

Update

В ответ на Запрос ctacke на полноту; здесь приведен пример кода для подключения обработчиков событий. Обычно я хотел бы использовать конструктор для этого (выберите текстовое поле, покажите сетку свойств, переключитесь на список событий и настройте обработчики среды для GotFocus и LostFocus), но если пользовательский интерфейс содержит более нескольких текстовых полей, которые вы, возможно, пожелаете чтобы он стал более автоматизированным.

Следующий класс предоставляет два статических метода: AttachGotLostFocusEvents и DetachGotLostFocusEvents; они принимают ControlCollection и два обработчика событий.

internal static class ControlHelper 
{ 
    private static bool IsGotLostFocusControl(Control ctl) 
    { 
     return ctl.GetType().IsSubclassOf(typeof(TextBoxBase)) || 
      (ctl.GetType() == typeof(ComboBox) && (ctl as ComboBox).DropDownStyle == ComboBoxStyle.DropDown); 
    } 

    public static void AttachGotLostFocusEvents(
     System.Windows.Forms.Control.ControlCollection controls, 
     EventHandler gotFocusEventHandler, 
     EventHandler lostFocusEventHandler) 
    { 
     foreach (Control ctl in controls) 
     { 
      if (IsGotLostFocusControl(ctl)) 
      { 
       ctl.GotFocus += gotFocusEventHandler; 
       ctl.LostFocus += lostFocusEventHandler ; 
      } 
      else if (ctl.Controls.Count > 0) 
      { 
       AttachGotLostFocusEvents(ctl.Controls, gotFocusEventHandler, lostFocusEventHandler); 
      } 
     } 
    } 

    public static void DetachGotLostFocusEvents(
     System.Windows.Forms.Control.ControlCollection controls, 
     EventHandler gotFocusEventHandler, 
     EventHandler lostFocusEventHandler) 
    { 
     foreach (Control ctl in controls) 
     { 
      if (IsGotLostFocusControl(ctl)) 
      { 
       ctl.GotFocus -= gotFocusEventHandler; 
       ctl.LostFocus -= lostFocusEventHandler; 
      } 
      else if (ctl.Controls.Count > 0) 
      { 
       DetachGotLostFocusEvents(ctl.Controls, gotFocusEventHandler, lostFocusEventHandler); 
      } 
     } 
    } 
} 

Пример использования в виде:

private void Form_Load(object sender, EventArgs e) 
{ 
    ControlHelper.AttachGotLostFocusEvents(
     this.Controls, 
     new EventHandler(EditControl_GotFocus), 
     new EventHandler(EditControl_LostFocus)); 
} 

private void Form_Closed(object sender, EventArgs e) 
{ 
    ControlHelper.DetachGotLostFocusEvents(
     this.Controls, 
     new EventHandler(EditControl_GotFocus), 
     new EventHandler(EditControl_LostFocus)); 
} 

private void EditControl_GotFocus(object sender, EventArgs e) 
{ 
    ShowKeyboard(); 
} 

private void EditControl_LostFocus(object sender, EventArgs e) 
{ 
    HideKeyboard(); 
} 
+1

Я просто читал эту статью: http://msdn.microsoft.com/en-us/library/ms838220.aspx, они также рекомендуют ловить событие Form_Closing. –

+0

Хорошая информация о Form_Closing вещи там; спасибо :) –

+0

Для полноты вы должны, вероятно, показать проводку событий. – ctacke

5

Используйте InputPanel class. Enable это когда вы получаете фокус, отключите его, когда вы потеряете фокус.

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