如何覆盖TextBox上的PreviewKeyDown?

时间:2014-04-05 15:46:13

标签: wpf wpfdatagrid routedevent

我在我制作的控件内的TextBox上有一个PreviewKeyDown事件的处理程序,它检查用户是否按下了向下键。当控件位于布局容器(如网格)内时,事件处理程序正确处理按键操作。但是,如果我将控件放在DataGrid的DataGridTempalteColumn中,则控件不会执行我需要它执行的操作。

我认为问题在于,因为PreviewKeyDown处于隧道策略中,所以主机DataGrid会在我的控件执行之前按下向下箭头键。对于向下箭头,DataGrid将焦点移动到下一行。 DataGrid似乎并没有将IsHandled设置为true,因为事件最终归结为我的控制,但它确实在事件上做了自己的事情,这对我来说是打破了事情。

问题不在于DataGrid,而是因为我的控件有一个来自TextBox的隧道预览KeyKeyDown事件。我正在寻找一种方法来覆盖TextBox上的这个默认事件。也许我可以对附加行为做些什么?也许我需要从TextBox继承然后覆盖?到目前为止,我还没有找到任何表明如何处理这种情况的事情。

以下是此问题的原始文本,但未提供任何答案

我在使用DataGridTemplateColumn中作为DataTemplate创建的自定义自动填充文本框时遇到了困难。

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

意图是当显示自动完成弹出窗口时,向下和向上按下允许用户导航其内容。当控件放在布局容器的层次结构中时,这可以正常工作;但是,当它是数据网格中单元格的一部分时,预期的行为将丢失。看起来像DataGrid使用previewKeyDown来应用它自己对向下或向上箭头的解释,虽然它没有将事件设置为处理,但是当事件发生时我的控件焦点丢失,并且不同的行是地选择。

我已经在网上看了一遍,但是找不到任何关于如何处理这个问题的线索。当然,我已经看到DataGridTemplateColumns中的控件处理所有类型的输入,但是他们如何实现这一点在我身上失去了。

1 个答案:

答案 0 :(得分:0)

好的,遵循一些使用Snoop的建议我弄清楚发生了什么。事实上,问题不在于DataGrid正在使用PreviewKEyDown事件做些什么,而是我将焦点从目前正在编辑的数据网格单元移开,触发CellEditEnding事件。这导致了我观察到的行为。