需要更多控制文本框的MouseDown和KeyDown

时间:2012-05-25 07:50:47

标签: c# wpf textbox

标题只是有些准确。我正在尝试用文本框做一些特别的事情并且缺少某些事件会导致一些麻烦,但我也想要一些关于如何做我正在尝试做的事情的一般建议。我正在尝试重新创建旧的访问应用程序中存在的特殊文本框。它用于输入社会安全号码,空白时显示___-__-____

当您单击任何空格时,它会突出显示特定字符​​。如果输入数字,则用该数字替换_。如果你点击删除或退格,它只是替换用_或a - 突出显示的任何字符,取决于。

我可以通过一个只读文本框并触发PreviewMouseUp事件来调用一个突出显示当前光标位置的方法来重新创建它。但由于它是只读的,它不会触发任何KeyUp或KeyDown事件来改变选择。如果我将KeyUp放在主UI网格中,我可以做到这一点,但它只适用于KeyUp,因此它看起来非常迟钝。与PreviewMouseUp相同的问题,我希望它在鼠标按下时突出显示,而不是向上,但是PreviewMouseDown什么都不会触发。

我觉得我用更乱,更乱的方式来做这件事。我已经描述了我想要的东西,有没有人有更好的想法如何实现这个并不是非常复杂?我想保持文本框只读,以允许我手动处理键输入。我的意思是,我原来的格式化方法是简单地在KeyUp上运行一个方法,它检查你添加的内容的长度并适当地格式化(添加短划线等),但这导致这一刻所有内容都看不到格式化,直到你释放钥匙。例如,如果我在文本框的中间按“2”,它会将所有短划线移动一个字符,直到释放“2”按钮,然后修改格式。

思想?

2 个答案:

答案 0 :(得分:1)

有趣的是,我现在已经花了很长时间才最终得到它,但关键在于AddHandler。对于那些想要这样的文本框的人来说,我就是这样做的。这里有一些杂乱的位,这些只是重新创建访问文本框的确切功能。最烦人的部分是实现退格按钮,因为它删除了所选部分之前的内容。另外,请确保您的文本框是IsReadOnly。

在构造函数中放置:

textBox_ssn.AddHandler(Control.MouseDownEvent, new MouseButtonEventHandler(ClickSS), true);
textBox_ssn.AddHandler(Control.KeyDownEvent, new KeyEventHandler(ButtonSS), true);

然后使用这两种方法:

public void ClickSS(object sender, EventArgs e)
    {
        textBox_ssn.SelectionLength = 1;
    }

    public void ButtonSS(object sender, KeyEventArgs e)
    {
        bool on_first_char = false;
        if (textBox_ssn.SelectionStart == 0) on_first_char = true;

        if (e.Key == Key.Right && textBox_ssn.SelectionStart < 10)
        {
            ++textBox_ssn.SelectionStart;
            textBox_ssn.SelectionLength = 1; //Without this, it will move around large blocks of selection
            if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
        }
        else if (e.Key == Key.Left && textBox_ssn.SelectionStart > 0)
        {
            --textBox_ssn.SelectionStart;
            textBox_ssn.SelectionLength = 1;
            if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
        }
        else
        {
            string temp = "";
            switch (e.Key)
            {
                case Key.D0:
                    temp = "0";
                    break;
                case Key.D1:
                    temp = "1";
                    break;
                case Key.D2:
                    temp = "2";
                    break;
                case Key.D3:
                    temp = "3";
                    break;
                case Key.D4:
                    temp = "4";
                    break;
                case Key.D5:
                    temp = "5";
                    break;
                case Key.D6:
                    temp = "6";
                    break;
                case Key.D7:
                    temp = "7";
                    break;
                case Key.D8:
                    temp = "8";
                    break;
                case Key.D9:
                    temp = "9";
                    break;
                case Key.Delete:
                    temp = "_";
                    break;
                case Key.Back:
                    temp = "_";
                    if (textBox_ssn.SelectionStart > 0) --textBox_ssn.SelectionStart;
                    if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
                    //else return; //or could do temp = selection text but only if selection length is 1 ectect
                    break;
            }

            if (temp != "")
            {
                if (textBox_ssn.SelectionLength > 1)
                {
                    string underscores = "";

                    foreach (char c in textBox_ssn.SelectedText)
                    {
                        if (c == '-') underscores += "-";
                        else underscores += "_";
                    }

                    textBox_ssn.SelectedText = underscores;
                    textBox_ssn.SelectionLength = 1;
                }

                if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
                if (textBox_ssn.SelectionLength == 1)
                {
                    if (!(on_first_char && e.Key == Key.Back)) textBox_ssn.SelectedText = temp;

                    if (e.Key == Key.Delete) ;
                    else if (e.Key == Key.Back)
                    {
                        if (textBox_ssn.SelectionStart > 0)
                        {
                            //--textBox_ssn.SelectionStart;
                            if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
                        }
                    }
                    else
                    {
                        ++textBox_ssn.SelectionStart;
                        if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
                    }
                }
            }
        }
    }

答案 1 :(得分:0)

您所描述的内容称为蒙面文本框。 VisualStudioGalleryExtended WPF ToolKit

中有一个免费的