.net cf TextBox, отображающий клавиатуру в фокусе - PullRequest
4 голосов
/ 09 июня 2009

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

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

Ответы [ 2 ]

13 голосов
/ 09 июня 2009

Добавьте 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;
}

Обновление

В ответ на запрос 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();
}
5 голосов
/ 09 июня 2009

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

...