Десятичный разделитель клавиатуры на Wpf TextBox, как? - PullRequest
7 голосов
/ 28 сентября 2010

У меня есть приложение Wpf с некоторым текстовым полем для десятичного ввода.

Я хотел бы, чтобы при нажатии клавиши «точка» (.) На цифровой клавиатуре клавиатуры ПК он отправлял правильный десятичный разделитель.

Например, на итальянском языке десятичный разделитель - «запятая» (,) ... Можно ли установить клавишу «точка» для отправки символа «запятая» при нажатии?

Ответы [ 3 ]

6 голосов
/ 05 декабря 2012

Хотя вы можете установить локаль конвертера по умолчанию в WPF в соответствии с предложением Мамты Далала, недостаточно преобразовать нажатие клавиши «десятичная» в правильную строку.Этот код будет отображать правильный символ валюты и формат даты / времени на элементах управления с привязкой к данным

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

Я обнаружил, что обработка события previewKeyDown по всему окну немного чище, чем для текстового поля (было бы лучшеесли он может быть применен в приложении).

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

Если кто-нибудь может придумать способ установить его в приложении ...

5 голосов
/ 14 мая 2011

Быстро и грязно:

   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;
        }
    }
3 голосов
/ 28 сентября 2010

Для этого вам необходимо глобализировать ваше приложение. Смотрите эти ссылки:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...