/ / Как да отменим PreviewKeyDown на TextBox? - wpf, wpfdatagrid, routedevent

Как да презапишете PreviewKeyDown на текстова кутия? - wpf, wpfdatagrid, routedevent

Имам обработващ сигнал за събитието PreviewKeyDownTextBox вътре в контрола, който направих, който проверява дали потребителят е натиснал клавиша надолу. Мениджърът на събитията правилно обработва натискането на клавиша, когато контролът седи в контейнер за оформление като решетка. Ако обаче поставя контрола в DataGrid DataGridTempalteColumn, контролът не прави това, което ми трябва.

Мисля, че проблемът е в това, чеPreviewKeyDown е на стратегия за тунелиране, хостът DataGrid получава, за да се справи с натискането на клавиша със стрелка надолу преди контрола ми да го направи. За стрелката надолу DataGrid премества фокуса към следващия ред. DataGrid изглежда не поставя IsHandled на истината, защото това събитие в крайна сметка се контролира, но въпреки това прави своето нещо на събитието, което разбива нещата за мен.

Проблемът наистина не е с DataGrid, нос факта, че моят контрол има тунелинг PreviewKeyDown събитие от TextBox. Търся начин да отменя това събитие по подразбиране в TextBox. Може би има нещо, което мога да направя с приложено поведение? Може би трябва да наследя от TextBox и след това да отменя? Досега не открих нищо, което да показва как да се справя с подобна ситуация.

По-долу е оригиналният текст на този въпрос, който не даде никакви отговори

Имам проблеми с използването на персонализирано текстово поле за автоматично довършване, което направих като DataTemplate в 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>

Класът actextbox произтича от контрола на потребителя и има обработващи събития, които да реагират на определени натискания на клавиши така

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;
}
}

Намерението е, когато изскача автоматично завършванепоказаното, натискането надолу и нагоре позволява на потребителя да се ориентира по неговото съдържание. Това работи както се очаква, когато контролът е поставен в йерархия на контейнерите за оформление; обаче, когато е част от клетката в мрежа с данни, очакваното поведение се губи. Изглежда, че previewKeyDown се използва от DataGrid за прилагане на собствена интерпретация на стрелките надолу или нагоре и макар да не определя събитието като обработено, по времето, когато събитието се сведе до контролния ми фокус, се губи и различен ред е избрали.

Погледнах онлайн навсякъде и не можахнамерете някакви улики как да се справите с това. Разбира се, видях контроли в DataGridTemplateColumns да обработват всякакви входове, но как те постигат това се губи върху мен.

Отговори:

0 за отговор № 1

Добре, следвайки някои съвети за използване на Snoop разбрахвън какво се случва. Всъщност проблемът не беше, че DataGrid прави нещо с събитието PreviewKEyDown, а в това, че се отдалечавам от клетката на мрежата от данни, която в момента се редактира, задейства събитие CellEditEnding. Това доведе до поведението, което наблюдавах.