1

我开发了一个 WPF 文本框,它在我们不断在文本框中输入数字时格式化数字。这是使用交互行为。现在,它适用于普通的常规键盘。但是由于我们支持全球化,文本框也应该支持日文字符(数字)以及全角字符。所以要测试,当我在(windows-controlpanel-region & langauage - 键盘和语言 - 更改键盘)中选择日文键盘 - Microsoft IME 并输入日文数字时,我的交互行为代码(连接)AssociatedObject_PreviewTextInput 在我按下之前不会被调用'输入'键,这给我带来了其他问题。对于普通键盘,只要我输入数字,这个函数就会被调用。

代码如下

private void AssociatedObject_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
     TextBox tb = sender as TextBox;
     // other stuff
}

protected override void OnAttached()
{
     base.OnAttached();
     AssociatedObject.PreviewTextInput += AssociatedObject_PreviewTextInput;
     /// other stuff
}

任何帮助表示赞赏。谢谢你。

4

1 回答 1

0

您可以收听以PreviewKeyDown/PreviewKeyUp获得每次中风的通知。

您可能希望通过TextBox直接操作 Text 属性来接管输入,而不是在按 Enter 后等待最终输入。

AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;

这里我只处理用户使用 IME 输入数字 (0~9) 的情况。我在插入符号处插入数字。通过设置e.Handled = true;,IME 将不会向 TextBox 输入任何内容。

private void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.ImeProcessedKey == Key.D0 ||
        e.ImeProcessedKey == Key.D1 ||
        e.ImeProcessedKey == Key.D2 ||
        e.ImeProcessedKey == Key.D3 ||
        e.ImeProcessedKey == Key.D4 ||
        e.ImeProcessedKey == Key.D5 ||
        e.ImeProcessedKey == Key.D6 ||
        e.ImeProcessedKey == Key.D7 ||
        e.ImeProcessedKey == Key.D8 ||
        e.ImeProcessedKey == Key.D9  )
    {
        TextBox tb = sender as TextBox;
        int index = tb.CaretIndex;

        //stripe the leading 'D'
        string d = e.ImeProcessedKey.ToString().Substring(1);
        tb.Text = tb.Text.Insert(index, d);

        tb.CaretIndex = index + 1; //I need to manually move the caret forward, since caret position was reset to 0.

        e.Handled = true; //important, so IME does not input to the TextBox
    }
}
于 2015-05-22T16:15:19.457 回答