2

タイトルはある程度正確です。テキストボックスで何か特別なことをしようとしていますが、特定のイベントが発生しないために問題が発生していますが、ここでやろうとしていることを行う方法についての一般的なアドバイスもお願いします. 古いアクセス アプリケーションに存在する特別なテキスト ボックスを再作成しようとしています。社会保障番号を入力するためのもので、空白の場合は と表示されます___-__-____

スペースのいずれかをクリックすると、特定の文字が強調表示されます。数値を入力すると、_ がその数値に置き換えられます。削除またはバックスペースを押すと、強調表示されている文字が _ または - に置き換えられます。

読み取り専用のテキスト ボックスを用意し、PreviewMouseUp イベントを発生させて、現在のカーソル位置を強調表示するメソッドを呼び出すことで、これを再現できます。ただし、読み取り専用であるため、選択を変更するための KeyUp または KeyDown イベントは発生しません。メイン UI グリッドに KeyUp を配置すれば、それを実現できますが、KeyUp でしか機能しないため、非常にラグが発生します。PreviewMouseUp と同じ問題があります。マウスを上ではなく押したときに強調表示したいのですが、PreviewMouseDown は何も起動しません。

私はこれについて、ますます厄介な方法で行っているように感じます。私が欲しいものを説明しましたが、これを達成する方法について、非常に複雑ではないより良いアイデアはありますか? キー入力を手動で処理できるように、テキストボックスを読み取り専用に保ちたいと思います。つまり、これをフォーマットする私の元の方法は、追加したものの長さをチェックして適切にフォーマットする(ダッシュを追加するなど)KeyUpでメソッドを実行するだけでしたが、その結果、この瞬間にすべてがフォーマットされていないように見えます。キーを放します。たとえば、テキストボックスの中央で「2」を押すと、「2」ボタンが離されるまですべてのダッシュが 1 文字分シフトされ、書式設定が修正されます。

考え?

4

2 に答える 2

1

面白いことに、私がこれを最終的に取得するまでにどれだけ長い間取り組んできたかはおかしな話ですが、鍵は AddHandler にありました。このようなテキスト ボックスが必要な場合は、次のようにします。ここにはいくつかの厄介な部分がありますが、それらは単にアクセス テキスト ボックスの正確な機能を再作成するためのものです。最も厄介な部分は、選択したセクションの前にあるものを削除するため、バックスペース ボタンを実装することでした。また、テキストボックスが IsReadOnly であることを確認してください。

コンストラクターに次のように入力します。

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

次に、次の 2 つの方法を使用します。

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 に答える