/ / Pour les caractères japonais pleine largeur, le comportement d'interactivité de la zone de texte WPF AttachedObject PreviewTextInput ne fonctionne pas - wpf, comportement, mode interactif

Pour les caractères de largeur totale japonais, le comportement d'interactivité de la zone de texte WPF AttachedObject PreviewTextInput ne fonctionne pas - wpf, comportement, mode interactif

J'ai développé une zone de texte WPF qui formatenombres que nous continuons à taper des nombres dans la zone de texte. Cela utilise le comportement d'interactivité. Maintenant, cela fonctionne bien avec un clavier normal normal. Mais comme nous prenons en charge la mondialisation, la zone de texte devrait également prendre en charge les caractères japonais (nombres) qui sont des caractères pleine largeur. Donc, pour tester, lorsque je sélectionne Clavier japonais - Microsoft IME dans (windows-controlpanel-region & langauage - clavier et langues - changer les claviers) et que je saisis des nombres japonais, mon code de comportement d'interactivité (raccordement) AssociatedObject_PreviewTextInput n'est pas appelé tant que je n'ai pas appuyé sur " Entrez "Clé qui crée d'autres problèmes pour moi. Pour le clavier normal, cette fonction est appelée dès que je tape un numéro.

Le code ressemble à ci-dessous

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
}

Toute aide est appréciée. Je vous remercie.

Réponses:

0 pour la réponse № 1

Vous pouvez écouter PreviewKeyDown/PreviewKeyUp pour être averti pour chaque coup.

Tout ce que vous voudrez peut-être prendre en charge l'entrée en manipulant TextBox"s Propriété de texte directement, au lieu d'attendre la saisie finale après avoir appuyé sur Entrée.

AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;

Ici, je gère simplement le cas où l'utilisateur utilise IME pour saisir des chiffres (0 ~ 9). J'insère le chiffre au curseur. Et en réglant e.Handled = true;, IME n'entrera rien dans la 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
}
}