首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PreviewKeyDown上重写TextBox?

如何在PreviewKeyDown上重写TextBox?
EN

Stack Overflow用户
提问于 2014-04-05 15:46:12
回答 1查看 1.1K关注 0票数 0

我在我创建的控件中的一个PreviewKeyDown事件上为TextBox事件设置了一个处理程序,它检查用户是否按下键。当控件像网格一样位于布局容器中时,事件处理程序将正确地处理按键。但是,如果我将该控件放置在DataGrid的DataGridTempalteColumn中,则该控件不执行我需要它做的事情。

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

问题不在于DataGrid,而在于我的控件有一个来自TextBox的隧道PreviewKeyDown事件。我正在寻找一种方法来覆盖TextBox上的默认事件。也许我能用附身的行为做点什么?也许我需要继承TextBox,然后重写?到目前为止,我还没有发现任何迹象表明如何处理这种情况。

下面是这个问题的原文,没有给出任何答案。

我在使用自定义自动完成文本框时遇到了困难,我在DataTemplate中创建了一个DataGridTemplateColumn。

代码语言:javascript
运行
复制
 <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类派生自用户控件,并具有事件处理程序来响应某些按键,如下所示

代码语言:javascript
运行
复制
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内部的控件处理了各种输入,但是它们是如何完成这一任务的。

EN

回答 1

Stack Overflow用户

发布于 2014-04-08 01:31:33

好的,按照一些使用Snoop的建议,我知道了发生了什么。事实上,问题不是DataGrid对PreviewKEyDown事件做了什么,而是我将注意力从当前正在编辑的触发CellEditEnding事件的数据网格单元中移开。这导致了我所观察到的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22883041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档