Traitez-moi de fou, mais pourquoi ne pas mettre les boutons plus et moins de chaque côté du contrôle TextBox et empêcher simplement le TextBox de recevoir le focus du curseur, créant ainsi votre propre contrôle NumericUpDown bon marché ?
Comment gérez-vous la saisie de valeurs numériques dans les applications WPF ?
Sans un contrôle NumericUpDown, j'ai utilisé un TextBox et géré son événement PreviewKeyDown avec le code ci-dessous, mais c'est plutôt moche.
Quelqu'un a-t-il trouvé un moyen plus simple d'obtenir des données numériques de l'utilisateur sans recourir à un contrôle tiers ?
private void NumericEditPreviewKeyDown(object sender, KeyEventArgs e)
{
bool isNumPadNumeric = (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Decimal;
bool isNumeric = (e.Key >= Key.D0 && e.Key <= Key.D9) || e.Key == Key.OemPeriod;
if ((isNumeric || isNumPadNumeric) && Keyboard.Modifiers != ModifierKeys.None)
{
e.Handled = true;
return;
}
bool isControl = ((Keyboard.Modifiers != ModifierKeys.None && Keyboard.Modifiers != ModifierKeys.Shift)
|| e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Insert
|| e.Key == Key.Down || e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up
|| e.Key == Key.Tab
|| e.Key == Key.PageDown || e.Key == Key.PageUp
|| e.Key == Key.Enter || e.Key == Key.Return || e.Key == Key.Escape
|| e.Key == Key.Home || e.Key == Key.End);
e.Handled = !isControl && !isNumeric && !isNumPadNumeric;
}
Traitez-moi de fou, mais pourquoi ne pas mettre les boutons plus et moins de chaque côté du contrôle TextBox et empêcher simplement le TextBox de recevoir le focus du curseur, créant ainsi votre propre contrôle NumericUpDown bon marché ?
Que diriez-vous :
protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !AreAllValidNumericChars(e.Text);
base.OnPreviewTextInput(e);
}
private bool AreAllValidNumericChars(string str)
{
foreach(char c in str)
{
if(!Char.IsNumber(c)) return false;
}
return true;
}
Vous pouvez également essayer d'utiliser la validation des données si les utilisateurs valident les données avant que vous ne les utilisiez. J'ai trouvé que faire cela était assez simple et plus propre que de jouer avec des clés.
Sinon, vous pouvez toujours désactiver la fonction Coller !
Ne pouvez-vous pas simplement utiliser quelque chose comme ce qui suit ?
int numericValue = 0;
if (false == int.TryParse(yourInput, out numericValue))
{
// handle non-numeric input
}
Private Sub Value1TextBox_PreviewTextInput(ByVal sender As Object, ByVal e As TextCompositionEventArgs) Handles Value1TextBox.PreviewTextInput
Try
If Not IsNumeric(e.Text) Then
e.Handled = True
End If
Catch ex As Exception
End Try
End Sub
A fonctionné pour moi.
void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
string sVal = e.Text;
int val = 0;
if (sVal != null && sVal.Length > 0)
{
if (int.TryParse(sVal, out val))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
}
public class NumericTextBox : TextBox
{
public NumericTextBox()
: base()
{
DataObject.AddPastingHandler(this, new DataObjectPastingEventHandler(CheckPasteFormat));
}
private Boolean CheckFormat(string text)
{
short val;
return Int16.TryParse(text, out val);
}
private void CheckPasteFormat(object sender, DataObjectPastingEventArgs e)
{
var isText = e.SourceDataObject.GetDataPresent(System.Windows.DataFormats.Text, true);
if (isText)
{
var text = e.SourceDataObject.GetData(DataFormats.Text) as string;
if (CheckFormat(text))
{
return;
}
}
e.CancelCommand();
}
protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
{
if (!CheckFormat(e.Text))
{
e.Handled = true;
}
else
{
base.OnPreviewTextInput(e);
}
}
}
De plus, vous pouvez personnaliser le comportement d'analyse en fournissant les propriétés de dépendance appropriées.