0

作成したコントロール内の TextBox に PreviewKeyDown イベントのハンドラーがあり、ユーザーが下向きのキーを押したかどうかを確認します。コントロールがグリッドのようなレイアウト コンテナー内にある場合、イベント ハンドラーはキーの押下を正しく処理します。しかし、DataGrid の DataGridTempalteColumn 内にコントロールを配置すると、コントロールは必要なことを実行しません。

問題は、PreviewKeyDown がトンネリング戦略にあるため、ホスト DataGrid が下矢印キーの押下をコントロールする前に処理できることだと思います。下矢印の場合、DataGrid はフォーカスを次の行に移動します。イベントが最終的に私のコントロールに到達するため、DataGrid は IsHandled を true に設定していないようですが、それでもイベントに対して独自の処理を行うため、問題が発生します。

問題は実際には DataGrid にあるのではなく、コントロールに TextBox からのトンネリング PreviewKeyDown イベントがあるという事実にあります。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 内のコントロールがあらゆる種類の入力を処理するのを見てきましたが、これをどのように達成するかはわかりません。

4

1 に答える 1