Wpf TextBox上的键盘小数分隔符,如何?
Posted
技术标签:
【中文标题】Wpf TextBox上的键盘小数分隔符,如何?【英文标题】:Keypad decimal separator on a Wpf TextBox, how to? 【发布时间】:2011-04-18 04:13:38 【问题描述】:我有一个带有一些用于十进制输入的文本框的 Wpf 应用程序。
我希望当我在电脑键盘的数字小键盘上按“点”键 (.) 时,它会发送正确的小数分隔符。
例如,在意大利语中,小数点分隔符是“逗号”(,)...是否可以设置“点”键在按下时发送“逗号”字符?
【问题讨论】:
【参考方案1】:又快又脏:
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;
【讨论】:
【参考方案2】:尽管您可以按照 Mamta Dalal 的建议在 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);
如果有人能想出一种在应用程序范围内设置它的方法...
【讨论】:
像魅力一样工作! 应该使用方法覆盖protected override void OnPreviewKeyDown(KeyEventArgs e)
而不是事件。以上是关于Wpf TextBox上的键盘小数分隔符,如何?的主要内容,如果未能解决你的问题,请参考以下文章