Como el título dice realmente. He echado un vistazo a la herencia de TextBox, pero la única anulación sensible fue "OnKeyDown", pero eso solo me da una clave de Key enum (sin forma de usar Char.IsNumeric()).¿Cómo crear un cuadro de texto numérico en Silverlight?
Respuesta
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.
Eche un vistazo a este, utiliza una propiedad adjunta sobre el cuadro de texto. Lo estoy usando y funciona. http://weblogs.asp.net/manishdalal/archive/2008/09/24/prevention-the-first-line-of-defense-with-attach-property-pixie-dust.aspx
su enlace parece haber muerto –
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;
}
}
}
}
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 –
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;
}
}
}
}
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;
}
}
}
}
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;
}
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;
}
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!
¿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);
}
}
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
Dang mi confianza! –
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;
}
}
}
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). –
Parece que el sitio web no funciona, gracias por la copia. – Caramiriel
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;
}
- 1. Cuadro de texto numérico con patrón MVVM
- 2. Crear un cuadro de texto numérico en java Cambiar con botones de incremento y disminución
- 3. Cuadro de texto de líneas múltiples en Silverlight
- 4. ¿Cómo creo un cuadro de diálogo emergente en Silverlight?
- 5. Cómo seleccionar texto en el bloque de texto Silverlight 3.0
- 6. ¿Crear un cuadro de diálogo de entrada?
- 7. Cómo crear un vector numérico de longitud cero en R
- 8. Silverlight - ¿cómo puedo obtener el texto del elemento seleccionado en un cuadro combinado
- 9. Evite que un cuadro de texto de solo lectura aparezca atenuado en Silverlight
- 10. MVVM- ¿Cómo puedo seleccionar texto en un cuadro de texto?
- 11. Insertar en la posición de intercalación con un cuadro de texto de Silverlight
- 12. Control personalizado de Silverlight Crear evento personalizado
- 13. Crear texto dinámicamente en el cuadro de diálogo
- 14. Desplazamiento automático en un cuadro de lista de Silverlight
- 15. Silverlight - Detener destacados en un cuadro de lista
- 16. ¿Cómo obtener/configurar la posición de intercalación en el cuadro de texto de Silverlight?
- 17. Seleccionar texto en un cuadro de texto deshabilitado en C#
- 18. Jquery fadeout texto en un cuadro de texto y texto
- 19. WPF: Crear un cuadro de diálogo/solicitud
- 20. texto fantasma - cómo tener en texto claro cuadro de texto
- 21. Cómo crear un cuadro de texto al estilo de Windows en una aplicación de C++ Win32
- 22. Cómo enfocar el cuadro de texto en WP7 usando MVVM?
- 23. ¿Cómo le doy un foco de texto en Silverlight?
- 24. El uso de un cuadro de texto HTML en lugar de un cuadro de texto ASP.NET
- 25. Ctrl + C en un cuadro de texto
- 26. Cómo crear un cuadro de texto de solo lectura en ASP.NET MVC3 Razor
- 27. Validar campo de texto numérico en jQuery
- 28. Anular la selección de texto en un cuadro de texto
- 29. Obtener texto seleccionado en un cuadro de texto
- 30. cómo configurar un texto en un texto de edición que está en un cuadro de diálogo?
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
¿Por qué cree que es un problema? =)) –