0

因为我是 WPF 开发的新手。

我想知道如何处理数字文本框。

与旧的 Windows 开发应用程序一样,我可以在按键事件中处理上述场景,但在 WPF 中我不会有此事件。

所以我必须在 Key Down 事件中处理这种情况。

但这有点复杂,我知道如何处理这个。

健康)状况 :

  1. 应该只允许数字和一个小数点。

  2. 小数点后只允许 2 个字符(数字)。

4

3 回答 3

0

您必须通过从本机 TextBox 继承来创建扩展文本框。并覆盖 OnTextInput 方法。根据需要处理输入。以下代码段将只允许数字而不是字符。同样的方式,您可以验证您的其他需求。

protected override void OnTextInput(TextCompositionEventArgs e)
    {
        string text = e.Text.ToString();
        double output = 0.0;
        bool isnumber = Double.TryParse(text, out output);
        if (!isnumber)
        {
            e.Handled = true;
        }
        base.OnTextInput(e);
    }
于 2013-06-24T05:24:55.747 回答
0

你可以对这些东西使用行为

public class TextBoxInputBehavior : Behavior<TextBox>
{
    const NumberStyles validNumberStyles = NumberStyles.AllowDecimalPoint |
                                               NumberStyles.AllowThousands |
                                               NumberStyles.AllowLeadingSign;
    public TextBoxInputBehavior()
    {
        this.InputMode = TextBoxInputMode.None;
    }

    public TextBoxInputMode InputMode { get; set; }

    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 CheckIsDigit(input);

            case TextBoxInputMode.DecimalInput:
                //minus einmal am anfang zulässig
                if (input.Contains("-"))
                    if (input.IndexOf("-") == 0 && input.LastIndexOf("-")==0)
                        return true;
                    else
                        return false;
                //wen mehr als ein Komma
                if (input.ToCharArray().Where(x => x == ',').Count() > 1)
                    return false;

                decimal d;
                return decimal.TryParse(input,validNumberStyles,CultureInfo.CurrentCulture, out d);
            default: throw new ArgumentException("Unknown TextBoxInputMode");

        }
        return true;
    }

    private bool CheckIsDigit(string wert)
    {
        return wert.ToCharArray().All(Char.IsDigit);
    }
}

public enum TextBoxInputMode
{
    None,
    DecimalInput,
    DigitInput
}

xml

<TextBox Text="{Binding MyDecimalProperty}">
        <i:Interaction.Behaviors>
            <Behaviors:TextBoxInputBehavior InputMode="DecimalInput"/>
        </i:Interaction.Behaviors>
    </TextBox>
于 2013-06-24T05:47:16.877 回答
-1
    //It's not satisfy second condition
        TextBox txtDecimal = sender as TextBox;
        if ((e.Key == Key.OemPeriod || e.Key == Key.Decimal) && (txtDecimal.Text.Contains(".") == false))
        { e.Handled = false;}
        else if ((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || (e.Key == Key.Back))
        { e.Handled = false; }
        else if((e.Key >= Key.D0 && e.Key <= Key.D9))
        { e.Handled = false; }
        else
        { e.Handled = true; }
于 2017-04-06T19:05:52.283 回答