【问题标题】:Textbox Keydown event not firing when arrow key press按下箭头键时不会触发文本框 Keydown 事件
【发布时间】:2013-09-21 10:13:29
【问题描述】:

我有一个数据网格,其中一列为 DataGridTemplateColumn,如下所示:

<my:DataGrid Name="dgvSales"   RowHeight="23"  SelectionUnit="Cell"  BeginningEdit="dgvSales_BeginningEdit"  AutoGenerateColumns="False"   CellEditEnding="dgvSales_CellEditEnding" >
                   <my:DataGrid.Columns>
                        <my:DataGridTemplateColumn Header="Product Name" Width="200">
                            <my:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Product_Name}"></TextBlock>
                                </DataTemplate>
                            </my:DataGridTemplateColumn.CellTemplate>
                            <my:DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <TextBox x:Name="txtbxProduct" Text="{Binding Product_Name}" TextChanged="txtbxProduct_TextChanged" KeyDown="txtbxProduct_KeyDown"></TextBox>
                                </DataTemplate>
                            </my:DataGridTemplateColumn.CellEditingTemplate>
                        </my:DataGridTemplateColumn>
                 </my:DataGrid.Columns>
</my:DataGrid>

当单元格值改变我想填充一些项目到列表视图中,TextChanged事件如下:

 private void txtbxProduct_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox tb = (TextBox)sender;
        if (tb.Text.Trim() != "")
        {
            string qry = "select PL.Record_Id as PList_Id,PM.Record_Id as Product_Id,PM.Product_Code,PM.Product_Name,PTM.Product_Type,PL.Purchase_Rate ,PL.Selling_Rate,PL.MRP  from dbo.Tbl_Product_Master PM  join Tbl_Product_List PL on PL.Product_Id=PM.Record_Id   join Tbl_Product_Type_Master PTM on PTM.Record_Id=PM.Product_Category_Id where PL.Batch_Flag=0  and PM.Is_Del='false'and PM.Is_Active='true'  and PM.Product_Name like '%" + tb.Text.Trim() + "%'  order by PM.Product_Name ";
            DataSet ds = ObjCommon.GetObject.ExecuteQuery_Select(Connection.ConnectionString, qry);
            if (ds.Tables[0].Rows.Count > 0)
            {
                lstvwProductCode.ItemsSource = ds.Tables[0].DefaultView;
                lstvwProductCode.Visibility = Visibility.Visible;
            }
            else
            {
                lstvwProductCode.ItemsSource = null;
                lstvwProductCode.Visibility = Visibility.Collapsed;
            }
        }
        else
        {
            lstvwProductCode.ItemsSource = null;
            lstvwProductCode.Visibility = Visibility.Collapsed;
        }
    }

当用户在键盘上输入向下键时,我想专注于列表视图,但是当我按下向下、返回、空格等键时它不会触发 Keydown 事件,但其他键(如字母数字键)都可以正常工作。我的keydown事件如下:

private void txtbxProduct_KeyDown(object sender, KeyEventArgs e)
    {
        TextBox tb = (TextBox)sender;
        if (e.Key == Key.Escape)
        {
            tb.Clear();
            lstvwProductCode.Visibility = Visibility.Collapsed;
            tb.Focus();
        }
        else if (e.Key == Key.Down)
        {
            if (lstvwProductCode.Items.Count > 0)
            {
                lstvwProductCode.SelectedIndex = 0;
                lstvwProductCode.Focus();
                lstvwProductCode.Visibility = Visibility.Visible;
            }
        }
    }

我在代码中做错了什么?

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    而不是使用 PreviewKeyDown

    【讨论】:

    • 回车键也是如此
    • 对于 Powershell,这看起来像:$widget.add_PreviewKeyDown( { ... } ).
    【解决方案2】:

    对于通常由 WPF 处理的导航键,不会引发 KeyDown 事件,但会引发 PreviewKeyDown 事件。如果您不希望 WPF 也处理按键事件,则应设置 Handled=True

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,PreviewKeyDown 也没有捕获箭头键和 Tab 键。 我正在从 WinForms 启动我的 WPF 窗口。 this 帖子帮助了我。 确切地说,这条线:ElementHost.EnableModelessKeyboardInterop(myWindow);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 2012-08-11
        • 1970-01-01
        相关资源
        最近更新 更多