[C#] L'événement Keybox Keyboard ne se déclenche pas lorsque la touche fléchée appuie


Answers

L'événement KeyDown n'est pas déclenché pour les clés de navigation normalement gérées par WPF, mais l'événement PreviewKeyDown est. Vous devez définir Handled=True si vous ne souhaitez pas que WPF gère également l'événement key.

Question

J'ai un DataGrid avec une colonne comme DataGridTemplateColumn comme suit:

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

Lorsque la modification de la valeur de la cellule, je veux remplir certains éléments à la liste, l'événement TextChanged est comme suit:

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

Lorsque l'utilisateur entre la touche bas du clavier, je veux me concentrer sur la liste, mais il ne déclenchera pas l'événement Keydown lorsque j'appuie sur les touches Bas, Retour, Espace etc., mais d'autres touches comme les touches alphanumériques fonctionnent correctement. est comme suit :

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

Qu'est-ce que j'ai fait de mal dans mon code?