/ / Comment remplacer PreviewKeyDown sur une zone de texte? - wpf, wpfdatagrid, routedevent

Comment remplacer PreviewKeyDown sur une zone de texte? - wpf, wpfdatagrid, routedevent

J'ai un gestionnaire pour l'événement PreviewKeyDown surune zone de texte à l'intérieur d'un contrôle que j'ai fait, qui vérifie si l'utilisateur a appuyé sur la touche bas. Le gestionnaire d'événements gère correctement la pression sur une touche lorsque le contrôle se trouve dans un conteneur de présentation, comme une grille. Si toutefois, je place le contrôle dans un DataGridTempalteColumn de DataGrid, le contrôle ne fait pas ce que j’ai besoin de faire.

Je pense que le problème est que parce que lePreviewKeyDown est sur une stratégie de tunneling, l'hôte DataGrid doit gérer la pression de la flèche vers le bas avant que mon contrôle ne le fasse. Pour la flèche vers le bas, le DataGrid déplace le focus sur la ligne suivante. Le DataGrid ne semble pas donner la valeur IsHandled à true, car il finit par tomber sous le contrôle de mon contrôle, mais il fait néanmoins sa propre chose sur l’événement, ce qui me casse la main.

Le problème ne concerne pas vraiment le DataGrid, maisavec le fait que mon contrôle a un événement de tunnelisation PreviewKeyDown de la zone de texte. Je cherche un moyen de remplacer cet événement par défaut dans la zone de texte. Peut-être que je peux faire quelque chose avec les comportements attachés? Peut-être dois-je hériter de la zone de texte et ensuite écraser? Jusqu'ici, je n'ai rien trouvé qui indique comment gérer une telle situation.

Ci-dessous le texte original de cette question qui n’a donné aucune réponse.

"Je ne parviens pas à utiliser une zone de texte autocomplete personnalisée créée en tant que DataTemplate dans un DataGridTemplateColumn.

 <DataGrid.Columns>
<DataGridTemplateColumn Header="Material" Width="300">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<local:actextbox Text="{Binding Path=Description, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
MatchList="{Binding Path=DataContext.LaborTemplatesList, RelativeSource={RelativeSource AncestorType=UserControl, AncestorLevel=2}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Description}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

</DataGrid.Columns>

La classe actextbox dérive du contrôle de l'utilisateur et dispose de gestionnaires d'événements permettant de répondre à certaines pressions

private void myTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Down & myPopup.IsOpen == true)
{
myPopUpList.SelectedIndex = 0;
ListBoxItem lbi = (ListBoxItem)myPopUpList.ItemContainerGenerator.ContainerFromItem(myPopUpList.SelectedItem);
lbi.Focus();
e.Handled = true;
}
}

L’intention est que lorsqu’une popup automatique à complétion automatique estaffiché, le fait d’appuyer sur les touches haut et bas permet à l’utilisateur de naviguer dans son contenu. Cela fonctionne comme prévu lorsque le contrôle est placé dans une hiérarchie de conteneurs de disposition; Toutefois, lorsqu'il fait partie de la cellule d'une grille de données, le comportement attendu est perdu. On dirait que previewGrand permet à DataGrid d’appliquer ses propres interprétations des flèches haut et bas, et même s’il ne définit pas l’événement comme étant géré, au moment où cet événement passe sous mon contrôle, le focus est perdu et la ligne différente est perdue. choisi.

J'ai "regardé partout en ligne et je n'ai pas putrouver des indices sur la façon de gérer cela. Certes, j'ai "vu des contrôles dans DataGridTemplateColumns gérer toutes sortes d'entrées, mais la façon dont ils accomplissent cela est perdue pour moi.

Réponses:

0 pour la réponse № 1

OK, après quelques conseils pour utiliser Snoop, j'ai pensédehors ce qui se passait. En fait, le problème n'était pas que DataGrid faisait quelque chose avec l'événement PreviewKEyDown, mais que je m'éloignais de la cellule de grille de données en cours de modification, déclenchant un événement CellEditEnding. Cela a entraîné le comportement que j'observais.