2010-09-28 16 views
7

J'ai une application Wpf avec une zone de texte pour l'entrée décimale.Séparateur décimal du clavier sur un TextBox Wpf, comment?

Je voudrais que lorsque j'appuie sur la touche "point" (.) Sur le pavé numérique du clavier pc, il envoie le séparateur décimal correct. Par exemple, en italien, le séparateur décimal est "virgule" (,) ... Est-il possible de définir la touche "point" pour envoyer le caractère "virgule" quand on appuie dessus?

Répondre

3

Pour cela, vous devez mettre votre candidature en application. Voir ces liens:

http://msdn.microsoft.com/en-us/library/ms788718.aspx

http://www.codeproject.com/KB/WPF/GlobalizeLocalizeAWPFPro.aspx

+0

Merci pour la suggestion ... J'ai aussi trouvé un billet de blog qui me aide: http: //www.metanous .be/pharcyde/post/Utilise-le-numérique-pavé-décimal-clé-comme-le-séparateur-numérique-pour-tous-les-locaux-comme-dans-Excel.aspx –

+0

LukePet, le lien propsoed est cassé, s'il vous plaît pourriez-vous répondre plus en détails. Merci. – sthiers

+0

Pour les utilisateurs de VB.NET: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4bedf3c3-be4f-4b2a-b5e0-21c1a41caeca/how-to-use-decimal-separator-in-a -wpf-textbox-? forum = wpf – Naucle

4

rapide et sale:

private void NumericTextBox_KeyDown(object sender, KeyEventArgs e) { 
     if (e.Key == Key.Decimal) { 
      var txb = sender as TextBox; 
      int caretPos=txb.CaretIndex; 
      txb.Text = txb.Text.Insert(txb.CaretIndex, System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator); 
      txb.CaretIndex = caretPos + 1; 
      e.Handled = true; 
     } 
    } 
6

Bien que vous pouvez définir les paramètres régionaux de conversion par défaut dans WPF comme suggéré par Mamta Dalal il ne suffit pas de convertir la touche "décimal" appuie sur la chaîne correcte. Ce code affiche le symbole monétaire et la date/format de l'heure sur les contrôles liés aux données

//Will set up correct string formats for data-bound controls, 
// but will not replace numpad decimal key press 
private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    //Among other settings, this code may be used 
    CultureInfo ci = CultureInfo.CurrentUICulture; 

    try 
    { 
     //Override the default culture with something from app settings 
     ci = new CultureInfo([insert your preferred settings retrieval method here]); 
    } 
    catch { } 
    Thread.CurrentThread.CurrentCulture = ci; 
    Thread.CurrentThread.CurrentUICulture = ci; 

    //Here is the important part for databinding default converters 
    FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof(FrameworkElement), 
      new FrameworkPropertyMetadata(
       XmlLanguage.GetLanguage(ci.IetfLanguageTag))); 
    //Other initialization things 
} 

je trouve que la manipulation de la fenêtre à l'échelle de l'événement PreviewKeyDown est un peu plus propre que textbox spécifique (il serait mieux si elle pourrait être appliqué à l'échelle de l'application).

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     //Among other code 
     if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator != ".") 
     { 
      //Handler attach - will not be done if not needed 
      PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown); 
     } 
    } 

    void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Decimal) 
     { 
      e.Handled = true; 

      if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.Length > 0) 
      { 
       Keyboard.FocusedElement.RaiseEvent(
        new TextCompositionEventArgs(
         InputManager.Current.PrimaryKeyboardDevice, 
         new TextComposition(InputManager.Current, 
          Keyboard.FocusedElement, 
          CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) 
         ) { RoutedEvent = TextCompositionManager.TextInputEvent}); 
      } 
     } 
    } 
} 

Si quelqu'un pouvait trouver un moyen de le mettre à l'échelle application ...

+0

Fonctionne comme un charme! – Goldorak84