0

私はC#とWPFにかなり慣れていませんが、最大14個の数字と3つのピリオドのみを許可するテキストボックスと、5つの数字のみを許可する別のテキストボックスを作成しようとしています。どうやってやるの?なんらかの理由で運がないスタックオーバーフローについて調査しました。私は多くの「解決策」を試しましたが、それらは私にとってはうまくいきませんでした。

4

2 に答える 2

2

nakiya さんの解決策を見ていると、何をすべきかわからないことがわかります。そこから何かを学ぶことができるように、完全な例を作成します。見てみましょう:

MainWindow.xaml

<TextBox TextChanged="TextBoxBase_OnTextChanged" />

MainWindow.cs

private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e) {
    var textBox = sender as TextBox;
    if (textBox != null) {
        string newValue = textBox.Text;
        int changed = ValidateText(ref newValue);

        int selectionStart = textBox.SelectionStart;
        textBox.Text = newValue;
        textBox.SelectionStart = selectionStart - changed;
    }
}

private int ValidateText(ref string input) {
    // If no value, return empty string
    if (input == null) return 0;

    int changed = 0;
    // Go through input string and create new string that only contains digits and period
    StringBuilder builder = new StringBuilder();
    for (int index = 0; index < input.Length; index++) {
        if (Char.IsDigit(input[index]) || input[index] == '.')
            builder.Append(input[index]);
        else changed++;
    }
    input = builder.ToString();
    return changed;
}
于 2013-03-05T08:55:44.743 に答える
0

必要に応じて、次のようにバインディングを設定できます。

<TextBox Text="{Binding Field, UpdateSourceTrigger=PropertyChanged}" />

次に、Fieldプロパティのセッターで要件を適用します。

public string Field
{
    get { return _field; }
    set
    {
        var val = MakeNumeric(value)
        _field = value;
        OnPropertyChanged("Field");
    }
}
于 2013-03-04T23:27:37.873 に答える