0

多くの人と同じように、WPF で数値テキスト ボックス コントロールを作成する必要があります。これまでのところ順調に進んでいますが、次のステップに向けてどのようなアプローチが適切かはわかりません。

コントロールの仕様の一部として、常に数値を表示する必要があります。ユーザーがすべてのテキストを強調表示し、バックスペースまたは削除をタップした場合、値が「空白」ではなくゼロに設定されていることを確認する必要があります。WPF コントロール モデルでこれを行うにはどうすればよいですか?

私がこれまでに持っているもの(省略):

public class PositiveIntegerTextBox : TextBox
{
    protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
    {
        // Ensure typed characters are numeric
    }

    protected override void OnPreviewDrop(DragEventArgs e)
    {
        // Ensure the dropped text is numeric.
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        if (this.Text == string.Empty)
        {
            this.Text = "0";
            // Setting the Text will fire OnTextChanged again--
            // Set Handled so all the other handlers only get called once.
            e.Handled = true; 
        }

        base.OnTextChanged(e);
    }

    private void HandlePreviewExecutedHandler(object sender, ExecutedRoutedEventArgs e)
    {
        // If something's being pasted, make sure it's numeric
    }
}

一方では、これは単純で、問題なく動作するようです。ただし、テキストをゼロにリセットする前に、常に(非常に簡単に)テキストを空白に設定しているため、それが正しいかどうかはわかりません。ただし、値が変更される前に値を操作できる PreviewTextChanged イベントはないため、これが私の最善の推測です。

それが正しいか?

4

1 に答える 1

0

OnPreviewTextInputハンドラーを使用して、着信値が int であるかどうかを確認し、変換しようとしないのはなぜですか...

Convert.ToInt32(e.Text);

変換が失敗した場合、それは int ではないため、テキストが変更されないように処理済みとしてマークします。

これはあなたのニーズにわずかに違反するかもしれませんが、つまり...すべてのテキストを削除しても0には戻りませんが、intのままです。個人的には、UI の観点からは、これはより論理的だと思います。すべての入力をクリアすると値が 0 に移動するのはなぜですか? TextBoxこれらの条件下で UI が変更されるため、それ自体が int 以外の値を受け入れると定義します。

于 2010-11-11T14:45:53.323 に答える