1

いくつかの単一行の Textboxes と 1 つの DataGrid (Windows8 の .Net 4.5) を含むウィンドウがあります。

どのコントロールにフォーカスがあるかに関係なく、ナビゲーション イベント (Up/Down/PgUp/PgDn など) をグリッドにルーティングしたいと考えています。

次のように、メイン ウィンドウで PreviewKeyDown をオーバーライドしようとしました。

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.Up:
        case Key.Down:
            myDataGrid.RaiseEvent(e);
            break;
    }
}

問題は、イベントが に反映され続けるため、StackOverflowException が発生することWindow_PreviewKeyDownです。

次の[醜い]回避策を試しました:

bool bEventRaised = false;
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if ( bEventRaised )
    {
        bEventRaised = false;
        return;
    }

    switch (e.Key)
    {
        case Key.Up:
        case Key.Down:
            bEventRaised = true;
            myDataGrid.RaiseEvent(e);
            break;
    }
}

に置き換えることif ( bEventRaised )をお勧めしif ( sender == myDataGrid )ますが、残念ながら、送信者は常にメイン ウィンドウです。

それにもかかわらず、これは私をもう少し先に進めました。キーボード イベントが に到達するのを確認できるようになりましmyDataGrid.PreviewKeyDownたが、それでも myDataGrid 内でイベントが発生しません。

私が何を間違っているのか、またはイベントを子 DataGrid にルーティングする別の方法があるかどうかを理解する助けが欲しいです。

ありがとう。

4

1 に答える 1