C # Как перевести ввод с клавиатуры в текст - PullRequest
1 голос
/ 14 января 2011

Я использую C # 3.0 в .NET Compact Framework 3.5, и программа должна иметь возможность работать как на устройствах Windows Mobile, так и на устройствах Windows CE.

Я создал свой собственный элемент управления с текстовым полем.Он не наследуется от TextBox или любого другого типа элемента управления текстовым полем, и это не вариант. Как я могу перевести ввод с клавиатуры в текст, чтобы я мог правильно установить для свойства Text элемента управления то, что печатает пользователь? Что касается свойства Text, то это обычная строковая переменная, которая ненужно быть более продвинутым, чем свойство TextBox.Text.

Я знаю, что один из способов - подписаться на событие KeyDown и вручную перевести параметр KeyEventArgs в текст для каждого символа.Я надеюсь, что есть лучшее решение, когда перевод ввода с клавиатуры для текста выполняется для меня фреймворком или ОС.Спасибо.

Что если бы у меня был невидимый TextBox, и я бы направил на него весь ввод с клавиатуры и установил свойство Text для моих элементов управления таким же, как свойство TextBoxe, каждый раз, когда его Text изменяется.Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 января 2011

Перевод ключей в строку (не текст, поскольку текст подразумевает для меня такие вещи, как шрифт, размер, местоположение и т. Д.) Не слишком сложен.Что-то вроде этого, вероятно, имеет большое значение для решения этой проблемы:

public class MyControl : Control
{
    private int m_cursorPos = 0;

    public MyControl()
    {
        Text = string.Empty;
        CursorPos = 0;
    }

    private int CursorPos 
    { 
        get { return m_cursorPos; } 
        set
        {
            if(value < 0) value = 0;
            if(value > Text.Length) value = Text.Length;

            m_cursorPos = value;
        }
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Back:
                if (CursorPos > 0)
                {
                    CursorPos--;
                    Text = Text.Remove(CursorPos, 1);
                }
                break;
            case Keys.Delete:
                if (CursorPos < Text.Length - 1)
                {
                    Text = Text.Remove(CursorPos, 1);
                }
                break;
            case Keys.Left:
                CursorPos--;
                break;
            case Keys.Right:
                CursorPos++;
                break;
            default:
                base.OnKeyDown(e);
                break;
        }
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (char.IsLetterOrDigit(e.KeyChar) 
               || char.IsSymbol(e.KeyChar) 
               || char.IsPunctuation(e.KeyChar) 
               || char.IsWhiteSpace(e.KeyChar))
        {
            Text = Text.Insert(CursorPos, char.ToString(e.KeyChar));
            CursorPos++;
            Debug.WriteLine(this.Text);
        }
    }
}

Конечно, тогда вы должны решить, как сделать рендеринг, и если у вас есть поддержка многострочных, это не будет обрабатывать клавиши вверх / вниз.

0 голосов
/ 14 января 2011

Я думаю, вы ищете класс KeyConverter . Хотя я не знаю, является ли это частью компактной структуры.

...