【问题标题】:Swap input character to WPF TextBox before it is added to the Text在将输入字符添加到文本之前将其交换到 WPF 文本框
【发布时间】:2011-03-25 05:06:16
【问题描述】:

我有一个用于处理数字的文本框。因此,我只接受 [0-9.,]。然而, ”。”是唯一有效的小数分隔符。因此,我只希望在我的文本中使用这个,但我也想接受“,”,并用“。”交换它。这样显示的字符是有效的。

那么 - 我如何交换输入字符?我假设我可以获取它并在某些输入事件中交换它?还是在插入文本框后必须更换它?

我尝试在 OnPreviewKeyDown 和 OnPreviewTextInput 事件中交换它,但保存输入字符的属性是只读的。我想做这样的事情:

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.OemComma)
    {
        e.Key = Key.OemPeriod; 
    }
    base.OnPreviewKeyDown(e);
}

【问题讨论】:

    标签: .net wpf textbox


    【解决方案1】:

    您只需要处理 PreviewKeyDown 以阻止其应用于文本,然后插入您自己的字符。您也可以使用它来过滤非数字输入:

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        switch (e.Key)
        {
            case Key.D0:
            case Key.D1:
            case Key.D2:
            case Key.D3:
            case Key.D4:
            case Key.D5:
            case Key.D6:
            case Key.D7:
            case Key.D8:
            case Key.D9:
            case Key.OemPeriod:
                base.OnPreviewKeyDown(e);
                break;
            case Key.OemComma:
                e.Handled = true;
                int caretIndex = CaretIndex;
                Text = Text.Insert(caretIndex, ".");
                CaretIndex = caretIndex + 1;
                break;
            default:
                e.Handled = true;
                break;
        }
    }
    

    【讨论】:

    • 这应该可以帮助我在一个地方处理所有事情,所以我相信这会有所帮助。谢谢!
    【解决方案2】:

    您可以使用 TextChanged 事件并每次替换 Text 属性。

    private void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox box = (TextBox)sender;
        box.Text = box.Text.Replace(",", ".");
    }
    

    如果你使用 Binding,你可以制作一个转换器,当它转换回来时替换文本。

    <TextBox Name="textBox" Text="{Binding Path=number, Converter=DecimalConverter}"  />
    

    public class DecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            return value;
        }
    
        public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            string strValue = (string)value;
            return strValue.Replace(",",".");
        }
    }
    

    【讨论】:

    • 谢谢。如果我需要在插入文本后这样做,这听起来像是一个合理的解决方案。在我接受答案之前等待,看看是否有人知道我是否可以控制实际输入的字符。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2020-05-13
    • 2010-10-20
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多