2

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

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

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

我觉得我正在以一种更混乱和更混乱的方式来解决这个问题。我已经描述了我想要的,有没有人有更好的想法来完成这个不是超级复杂的?我想将文本框保持为只读,以允许我手动处理键输入。我的意思是,我最初的格式化方法是简单地在 KeyUp 上运行一个方法,该方法检查您添加的内容的长度并适当地格式化(添加破折号等),但这会导致此时一切看起来都没有格式化,直到您释放钥匙。例如,如果我在文本框的中间按“2”,它会将所有破折号移动一个字符,直到“2”按钮被释放,然后格式就被修复了。

想法?

4

2 回答 2

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;
                    }
                }
            }
        }
    }
于 2012-05-25T09:10:55.113 回答
0

您所描述的内容被称为蒙面文本框。VisualStudioGalleryExtended WPF ToolKit中有一个免费的

于 2012-05-30T04:35:37.570 回答