How to create a numeric textbox in Silverlight?

前端 未结 11 934
礼貌的吻别
礼貌的吻别 2020-12-16 00:37

As the title says really. I\'ve had a look at inheriting from TextBox, but the only sensible override was \"OnKeyDown\", but that just gives me a key from the Key enum (with

相关标签:
11条回答
  • 2020-12-16 01:20

    Take a look at NumericUpDown in the Toolkit http://codeplex.com/Silverlight and maybe you can use that or look at the source to implement your own numeric textbox.

    0 讨论(0)
  • 2020-12-16 01:22

    Take a look at this one, it uses an attached property over the textbox. I am using it and it does work. http://weblogs.asp.net/manishdalal/archive/2008/09/24/prevention-the-first-line-of-defense-with-attach-property-pixie-dust.aspx

    0 讨论(0)
  • 2020-12-16 01:22

    It works:

    static bool AltGrIsPressed;
    
    void Numclient_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Alt)
        {
            AltGrIsPressed = false;
        }
    }
    
    void Numclient_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Alt)
        {
            AltGrIsPressed = true;
        }
    
        if (Keyboard.Modifiers == ModifierKeys.Shift || AltGrIsPressed == true)
        {
            e.Handled = true;
        }
    
        if (e.Handled == false && (e.Key < Key.D0 || e.Key > Key.D9))
        {
            if (e.Key < Key.NumPad0 || e.Key > Key.NumPad9)
            {
                if (e.Key != Key.Back)
                {
                    e.Handled = true;
                }
            }
        }       
    }
    
    0 讨论(0)
  • 2020-12-16 01:23
    private void Numclient_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key < Key.D0 || e.Key > Key.D9)
        {
            if (e.Key < Key.NumPad0 || e.Key > Key.NumPad9)
            {
                if (e.Key != Key.Back && e.Key != Key.Shift)
                {
                    e.Handled = true;
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-16 01:25

    I know it has been answered, but I found no proper solution that handles all special cases, most answers here swallows some important keys like Home, End, Tab, Shift+ any thing, ..etc.

    So, I developed my own implementation as it may help somebody!

    public class IntegerTextBox : TextBox
        {
            /// <summary>
            /// To be raised whenever integer value changed
            /// </summary>
            public event EventHandler ValueChanged;
    
            /// <summary>
            /// To restore if the user entered invalid characters
            /// </summary>
            private int lastSavedValue = 0;
    
            private int lastSelectionStart = 0;
            private int lastSelectionLength = 0;
    
    
            public int IntegerValue
            {
                get
                {
                    //the default value is 0 if there is no text in the textbox
                    int value = 0;
                    int.TryParse(Text, out value);
                    return value;
                }
                set
                {
                    if (this.Text.Trim() != value.ToString())
                    {
                        Text = value.ToString();
                    }
                }
            }
    
            public IntegerTextBox()
                : base()
            {
                this.LostFocus += (sender, e) =>
                    {
                        //if the user clears the text the text box and leaves it, set it to default value
                        if (string.IsNullOrWhiteSpace(this.Text))
                            IntegerValue = 0;
                    };
                this.Loaded += (sender, e) =>
                    {
                        //populate the textbox with Initial IntegerValue (default = 0)
                        this.Text = this.IntegerValue.ToString();
                    };
    
                this.TextChanged += (sender, e) =>
                    {
                        int newValue = 0;
                        if (int.TryParse(this.Text, out newValue)) //this will handle most cases like number exceeds the int max limits, negative numbers, ...etc.
                        {
                            if (string.IsNullOrWhiteSpace(Text) || lastSavedValue != newValue)
                            {
                                lastSavedValue = newValue;
                                //raise the event
                                EventHandler handler = ValueChanged;
                                if (handler != null)
                                    handler(this, EventArgs.Empty);
    
                            }
                        }
                        else 
                        {
                            //restore previous number
                            this.Text = lastSavedValue.ToString();
                            //restore selected text
                            this.SelectionStart = lastSelectionStart;
                            this.SelectionLength = lastSelectionLength;
                        }
                    };
    
                this.KeyDown += (sender, e) =>
                    {
                        //before every key press, save selection start and length to handle overwriting selected numbers
                        lastSelectionStart = this.SelectionStart;
                        lastSelectionLength = this.SelectionLength;
                    };
            }
        } 
    

    The above code has a single disadvantage, TextChanged event will be raised frequently, but since we need an integer textbox, then we can rely on ValueChanged instead!

    0 讨论(0)
提交回复
热议问题