2008-11-06 17 views

Respuesta

5

Eche un vistazo a NumericUpDown en el Toolkit http://codeplex.com/Silverlight y tal vez pueda usarlo o ver la fuente para implementar su propio cuadro de texto numérico.

+1

Sólo hay un problema con NumericUpDown. Por ejemplo, tiene el valor 999 y utiliza el retroceso para borrar la entrada, luego pierde el foco y vuelve a establecer 999 en lugar de fijarlo a 0. – Rumplin

+0

¿Por qué cree que es un problema? =)) –

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

la edición de amurra es una mejora en esto, nosotros en cambio: http://stackoverflow.com/questions/268207/how-to-create-a-numeric-textbox-in-silverlight/1469073 # 1469073 –

9

Tomé respuesta sugerida de Nidhal y edité un poco para manejar el caso de cambio de los personajes por encima de los dígitos (es decir.! @ # $%^& *()), ya que la solución todavía permitirá esos personajes en el cuadro de texto.

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

Esto traga la TAB y la tecla Mayús-Tab también. –

+0

¿cómo harías esto en MVVM? – user20358

+0

¿Funciona esto en un teclado AZERTY? – Koen

1

Funciona:

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

Extender el control normal Silverlight Cuadro de texto. Añadir este código dentro de la clase TextBox extendida:

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

Sé que ha sido contestada, pero no he encontrado ninguna solución adecuada que maneja todos los casos especiales, la mayoría de las respuestas aquí se traga algunas claves importantes como Inicio, Fin, Tab, Shift + cualquier cosa, ..etc.

¡Así que desarrollé mi propia implementación ya que puede ayudar a alguien!

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

El código anterior tiene una sola desventaja, evento TextChanged se plantea a menudo, pero ya que tenemos un cuadro de texto integer, entonces podemos confiar en ValueChanged lugar!

-1

¿Por qué no todos están haciendo el trabajo duro de solo manejarlos a todos?

aquí (esto es la perfección):

<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 a Key.D9 no representan números en AZERTY, p. (solo en combinación con turno).Ese es solo el comienzo de arreglar este código. Tanto para la perfección ... – Koen

+1

Dang mi confianza! –

7

Visita http://www.dataartist.net/blog/post/Silverlight-Behavior-Modifications-13-NumericOnlyBehavior.aspx o conducta de consumo de cuadro de texto de la siguiente manera

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

Un comportamiento es definitivamente el camino a seguir. También es más fácil de eliminar que las propiedades adjuntas. (Las propiedades adjuntas que se conectan a los controladores KeyUp y KeyDown tienen buenas posibilidades de crear raíces de GC y evitar la recolección de basura. El comportamiento se puede modificar para que todos los controladores de eventos se agreguen en el evento Loaded y luego se desenganchen en el evento Unloaded). –

+0

Parece que el sitio web no funciona, gracias por la copia. – 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; 
    } 
Cuestiones relacionadas