C#如何将键盘输入转换为文本

时间:2011-01-14 06:12:25

标签: c# windows-mobile compact-framework windows-ce

我在.NET Compact Framework 3.5中使用C#3.0,该程序需要能够在Windows Mobile和Windows CE设备上运行。

我创建了自己的自定义文本框控件。它不从TextBox或任何其他类型的文本框控件继承,并且这样做不是一个选项。 如何将键盘输入转换为文本,以便我可以正确地将控件的Text属性设置为用户键入的内容?就Text属性而言,它只是一个普通的字符串变量,并且不需要比TextBox.Text属性更高级。

我知道一种方法是订阅KeyDown事件并将KeyEventArgs参数手动转换为每个字符的文本。我希望有一个更好的解决方案,通过框架或操作系统为我完成键盘输入到文本的转换。 感谢。

如果我有一个不可见的TextBox并将所有键盘输入传递给它,并且每次Text更改时将我的控件Text属性设置为与TextBoxe相同,该怎么办?有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

将键转换为字符串(不是文本,因为文本暗示我的字体,大小,位置等等)并不过分复杂。这样的事情可能会有很长的路要走:

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);
        }
    }
}

当然,您必须决定如何进行渲染,如果您有多线支持,则无法处理上/下键。

答案 1 :(得分:0)

我认为您正在寻找KeyConverter课程。不过,我不知道这是否是紧凑框架的一部分。