0

一言で言えば私の問題:

ユーザーが10進数のみを入力できるようにするWPFTextBoxがあります。TextBoxのPreviewTextInputイベントハンドラーに検証ロジックがあります。

だから私が試した運賃:

TryParseの使用

double number = 0;
bool isSuccessful = double.TryParse(e.Text, out number);
e.Handled = !(number >= 0 && isSuccessful);

正規表現の使用:(この質問に対するJustinMorganの回答による)

string validNumberFormat = @"^[-+]?(\d{1,3}((,\d{3})*(\.\d+)?|([.\s]\d{3})*(,\d+)?)|\d+([,\.]\d+)?)$";
e.Handled  = Regex.Matches(e.Text, validNumberFormat).Count < 1;

上記の両方の方法では、数字のみを入力できますが、小数点は1つではありません。

どんな提案でも大歓迎です。

4

2 に答える 2

2

PreviewTextInputを直接処理する代わりに、動作(Blend SDK System.Windows.Interactivity)を使用します。再利用性のためにこれを行います。また、スペースはTextInputで処理されず、貼り付けも処理されないことを知っておく必要があります。ところで、あなたの「小数点」の問題に関しては、ジョナサンとフェリーチェ・ポラーノは正しいと思います。

public class TextBoxInputBehavior : Behavior<TextBox>
{
    public TextBoxInputMode InputMode { get; set; }

    public TextBoxInputBehavior()
    {
        this.InputMode = TextBoxInputMode.None;
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewTextInput += AssociatedObjectPreviewTextInput;
        AssociatedObject.PreviewKeyDown += AssociatedObjectPreviewKeyDown;

        DataObject.AddPastingHandler(AssociatedObject, Pasting);

    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewTextInput -= AssociatedObjectPreviewTextInput;
        AssociatedObject.PreviewKeyDown -= AssociatedObjectPreviewKeyDown;

        DataObject.RemovePastingHandler(AssociatedObject, Pasting);
    }

    private void Pasting(object sender, DataObjectPastingEventArgs e)
    {
        if (e.DataObject.GetDataPresent(typeof(string)))
        {
            var pastedText = (string)e.DataObject.GetData(typeof(string));

            if(!this.IsValidInput(this.GetText(pastedText)))
            {
                System.Media.SystemSounds.Beep.Play();
                e.CancelCommand();
            }
        }
        else
        {
            System.Media.SystemSounds.Beep.Play();
            e.CancelCommand();
        }
    }

    private void AssociatedObjectPreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Space)
        {
            if (!this.IsValidInput(this.GetText(" ")))
            {
                System.Media.SystemSounds.Beep.Play();
                e.Handled = true;
            }
        }
    }

    private void AssociatedObjectPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        if (!this.IsValidInput(this.GetText(e.Text)))
        {
            System.Media.SystemSounds.Beep.Play();
            e.Handled = true;
        }
    }

    private string GetText(string input)
    {
        var txt = this.AssociatedObject;
        var realtext = txt.Text.Remove(txt.SelectionStart, txt.SelectionLength);
        var newtext = realtext.Insert(txt.CaretIndex, input);

        return newtext;
    }

    private bool IsValidInput(string input)
    {
        switch (InputMode)
        {
            case TextBoxInputMode.None:
                return true;
            case TextBoxInputMode.DigitInput:
                return input.CheckIsDigit();

            case TextBoxInputMode.DecimalInput:
                //minus einmal am anfang zulässig
                if (input == "-")
                    return true;
                decimal d;
                return decimal.TryParse(input, out d);
            default: throw new ArgumentException("Unknown TextBoxInputMode");

        }
        return true;
    }
}

public enum TextBoxInputMode
{
    None,
    DecimalInput,
    DigitInput
}

を使用して

   <TextBox>
        <i:Interaction.Behaviors>
            <MyBehaviors:TextBoxInputBehavior InputMode="DecimalInput"/>
        </i:Interaction.Behaviors>
    </TextBox>                
于 2012-07-06T07:23:06.287 に答える
0

以下の無料のコントロールを利用できます。これにより、作業が簡単でシンプルになり ますhttp://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&referringTitle=Home

http://wpftoolkit.codeplex.com/wikipage?title=DoubleUpDown&referringTitle=Home

于 2012-07-06T09:46:23.187 に答える