2008-11-06 9 views

Trả lời

5

Hãy xem NumericUpDown trong Bộ công cụ http://codeplex.com/Silverlight và có thể bạn có thể sử dụng hoặc xem nguồn để triển khai hộp văn bản số của riêng bạn.

+1

Chỉ có một vấn đề với NumericUpDown. Ví dụ bạn có giá trị 999 trong đó và bạn sử dụng backspace để xóa đầu vào, sau đó bạn mất tiêu điểm và nó đặt lại 999 thay vì đặt nó thành 0. – Rumplin

+0

Tại sao bạn cho rằng đó là sự cố? =)) –

6
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

chỉnh sửa của amurra là một sự thay đổi về điều này, thay vào đó chúng tôi thay thế: http://stackoverflow.com/questions/268207/how-to-create-a-numeric-textbox-in-silverlight/1469073 # 1469073 –

9

tôi lấy câu trả lời gợi ý Nidhal và sửa nó một chút để xử lý các trường hợp ca cho những nhân vật trên các chữ số (ví dụ.! @ # $%^& *()) kể từ khi giải pháp mà sẽ vẫn cho phép những ký tự đó trong hộp văn bản.

private void NumClient_KeyDown(object sender, KeyEventArgs e) 
{  
    // Handle Shift case 
    if (Keyboard.Modifiers == ModifierKeys.Shift) 
    { 
     e.Handled = true; 
    } 

    // Handle all other cases 
    if (!e.Handled && (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; 
      } 
     } 
    }   
} 
+2

Thao tác này cũng sẽ nuốt phím TAB và phím shift-Tab. –

+0

Bạn sẽ làm điều này như thế nào trong MVVM? – user20358

+0

Tính năng này có hoạt động trên bàn phím AZERTY không? – Koen

1

Nó hoạt động:

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; 
      } 
     } 
    }  
} 
1
private void txtbox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.D0 || e.Key == Key.D1 || e.Key == Key.D2 || e.Key == Key.D3 || e.Key == Key.D4 || e.Key == Key.D5 || e.Key == Key.D6 || e.Key == Key.D7 || e.Key == Key.D8 || e.Key == Key.D9 || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6 || e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9) 
     e.Handled = false; 
    else 
     e.Handled = true; 
} 
0

Kéo dài tuổi bình thường kiểm soát Silverlight Textbox. Thêm mã này bên trong lớp TextBox mở rộng:

string nums = "1234567890"; 
string lastText = ""; 
int lastSelStart = 0; 

protected override void TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if(!nums.Contains(this.Text.Substring(this.Text.Length -1))) 
    { 
     this.Text = lastText; 
     this.SelectionStart = lastSelStart; 
     return; 
    } 

    lastText = this.Text; 
    lastSelStart = this.SelectionStart; 

} 
1

Tôi biết nó đã được trả lời, nhưng tôi thấy không có giải pháp thích hợp để xử lý tất cả các trường hợp đặc biệt, hầu hết các câu trả lời ở đây nuốt một số phím quan trọng như Home, End, Tab, Shift + bất cứ điều gì, ..etc.

Vì vậy, tôi đã phát triển triển khai của riêng mình vì nó có thể giúp ai đó!

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; 
       }; 
     } 
    } 

Đoạn mã trên có một nhược điểm duy nhất, TextChanged sự kiện sẽ được nâng lên thường xuyên, nhưng vì chúng ta cần một textbox integer, sau đó chúng ta có thể dựa vào ValueChanged thay!

-1

Tại sao mọi người không làm việc chăm chỉ để xử lý tất cả?

đây (đây là sự hoàn hảo):

<TextBox KeyDown="TextBox_KeyDown" /> 

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    var _Letter = string.Empty; 
    switch (e.Key) 
    { 
     case Key.A: _Letter = "A"; break; 
     case Key.Add: _Letter = "+"; break; 
     case Key.Alt: break; 
     case Key.B: _Letter = "B"; break; 
     case Key.Back: break; 
     case Key.C: _Letter = "C"; break; 
     case Key.CapsLock: break; 
     case Key.Ctrl: break; 
     case Key.D: _Letter = "D"; break; 
     case Key.D0: _Letter = "0"; break; 
     case Key.D1: _Letter = "1"; break; 
     case Key.D2: _Letter = "2"; break; 
     case Key.D3: _Letter = "3"; break; 
     case Key.D4: _Letter = "4"; break; 
     case Key.D5: _Letter = "5"; break; 
     case Key.D6: _Letter = "6"; break; 
     case Key.D7: _Letter = "7"; break; 
     case Key.D8: _Letter = "8"; break; 
     case Key.D9: _Letter = "9"; break; 
     case Key.Decimal: _Letter = "."; break; 
     case Key.Delete: break; 
     case Key.Divide: _Letter = "/"; break; 
     case Key.Down: break; 
     case Key.E: _Letter = "E"; break; 
     case Key.End: break; 
     case Key.Enter: break; 
     case Key.Escape: break; 
     case Key.F: _Letter = "F"; break; 
     case Key.F1: break; 
     case Key.F10: break; 
     case Key.F11: break; 
     case Key.F12: break; 
     case Key.F2: break; 
     case Key.F3: break; 
     case Key.F4: break; 
     case Key.F5: break; 
     case Key.F6: break; 
     case Key.F7: break; 
     case Key.F8: break; 
     case Key.F9: break; 
     case Key.G: _Letter = "G"; break; 
     case Key.H: _Letter = "H"; break; 
     case Key.Home: break; 
     case Key.I: _Letter = "I"; break; 
     case Key.Insert: break; 
     case Key.J: _Letter = "J"; break; 
     case Key.K: _Letter = "K"; break; 
     case Key.L: _Letter = "L"; break; 
     case Key.Left: break; 
     case Key.M: _Letter = "M"; break; 
     case Key.Multiply: _Letter = "*"; break; 
     case Key.N: _Letter = "N"; break; 
     case Key.None: break; 
     case Key.NumPad0: _Letter = "0"; break; 
     case Key.NumPad1: _Letter = "1"; break; 
     case Key.NumPad2: _Letter = "2"; break; 
     case Key.NumPad3: _Letter = "3"; break; 
     case Key.NumPad4: _Letter = "4"; break; 
     case Key.NumPad5: _Letter = "5"; break; 
     case Key.NumPad6: _Letter = "6"; break; 
     case Key.NumPad7: _Letter = "7"; break; 
     case Key.NumPad8: _Letter = "8"; break; 
     case Key.NumPad9: _Letter = "9"; break; 
     case Key.O: _Letter = "O"; break; 
     case Key.P: _Letter = "P"; break; 
     case Key.PageDown: break; 
     case Key.PageUp: break; 
     case Key.Q: _Letter = "Q"; break; 
     case Key.R: _Letter = "R"; break; 
     case Key.Right: break; 
     case Key.S: _Letter = "S"; break; 
     case Key.Shift: break; 
     case Key.Space: _Letter = " "; break; 
     case Key.Subtract: _Letter = "-"; break; 
     case Key.T: _Letter = "T"; break; 
     case Key.Tab: break; 
     case Key.U: _Letter = "U"; break; 
     case Key.Unknown: break; 
     case Key.Up: break; 
     case Key.V: _Letter = "V"; break; 
     case Key.W: _Letter = "W"; break; 
     case Key.X: _Letter = "X"; break; 
     case Key.Y: _Letter = "Y"; break; 
     case Key.Z: _Letter = "Z"; break; 
     default: break; 
    } 
    var _Text = (sender as TextBox).Text + _Letter; 
    double _Double; 
    e.Handled = !double.TryParse(_Text, out _Double); 
} 

}

+1

Key.D0 đến Key.D9 không đại diện cho số trên AZERTY, ví dụ: (chỉ kết hợp với ca làm việc).Đó chỉ là khởi đầu của việc sửa mã này. Vì vậy, nhiều cho sự hoàn hảo ... – Koen

+1

Dang sự tự tin của tôi! –

7

Visit http://www.dataartist.net/blog/post/Silverlight-Behavior-Modifications-13-NumericOnlyBehavior.aspx hoặc hành vi sử dụng TextBox như sau

using System; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Input; 
    using System.Windows.Interactivity; 

    namespace DataArtist 
    { 
public class NumericOnly : Behavior<TextBox> 
{ 
    private string Text { get; set; } 
    private bool shiftKey; 
    public bool StripOnExit { get; set; } 

    public NumericOnly() 
    { 
     StripOnExit = false; 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.KeyDown += KeyDown; 
     AssociatedObject.KeyUp += KeyUp; 
     AssociatedObject.GotFocus += GotFocus; 
     AssociatedObject.LostFocus += LostFocus; 
    } 

    void KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Shift) 
     { 
      shiftKey = false; 
     } 
    } 

    void KeyDown(object sender, KeyEventArgs e) 
    { 
     if (StripOnExit != false || e.Key == Key.Tab || e.Key == Key.Enter) 
     { 
      return; 
     } 

     if (e.Key == Key.Shift) 
     { 
      shiftKey = true; 
     } 
     else 
     { 
      if (IsNumericKey(e.Key) == false) 
      { 
       e.Handled = true; 
      } 
     } 
    } 

    void GotFocus(object sender, RoutedEventArgs e) 
    { 
     Text = AssociatedObject.Text; 
    } 

    private void LostFocus(object sender, RoutedEventArgs e) 
    { 
     if (AssociatedObject.Text == Text) 
     { 
      return; 
     } 

     string content = string.Empty; 

     foreach (var c in AssociatedObject.Text) 
     { 
      if (Char.IsNumber(c) == true) 
      { 
       content += c; 
      } 
     } 

     AssociatedObject.Text = content; 
    } 

    public bool IsNumericKey(Key key) 
    { 
     if (shiftKey == true) 
     { 
      return false; 
     } 

     string code = key.ToString().Replace("NumPad", "D"); 

     if (code[0] == 'D' && code.Length > 1) 
     { 
      return (Char.IsNumber(code[1])); 
     } 

     return false; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.KeyDown -= KeyDown; 
     AssociatedObject.LostFocus -= LostFocus; 
     AssociatedObject.GotFocus -= GotFocus; 
    } 
} 
    } 
+0

Một hành vi chắc chắn là con đường để đi. Nó cũng dễ dàng hơn để xóa ra hơn thuộc tính đính kèm. (Các thuộc tính được gắn vào bộ xử lý KeyUp và KeyDown có cơ hội tạo rễ GC và ngăn chặn việc thu gom rác. Hành vi này có thể được sửa đổi để tất cả các trình xử lý sự kiện được thêm vào sự kiện đã tải và sau đó chưa được mở trong sự kiện Unloaded.) –

+0

Trang web dường như không hoạt động, cảm ơn bạn đã sao chép. – Caramiriel

2
private void TextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     bool isDigit = e.Key >= Key.D0 && e.Key < Key.D9 || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6 || 
     e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9 ||e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Left || e.Key == Key.Right; 

     if (isDigit) { } 
     else 
      e.Handled = true; 
    }