44

UserControl を含むページがあります。ユーザーがページ上の任意の場所で Esc キーを押した場合、処理したい。

これは、PreviewKeyDown イベントを接続し、Esc キーをテストしてから処理するのと同じくらい簡単だと思いました。しかし、イベント ハンドラに I ブレークポイントを配置すると、呼び出されないことがわかりました。おそらく UserControl がヒットしている可能性があると思ったので、そこで PreviewKeyDown を試しました...同じ結果です。

Page オブジェクトで KeyDown または PreviewKeyDown をテストする適切な場所を知っている人はいますか?

4

13 に答える 13

52

ウィンドウのイベントにアタッチ

コントロールがロードされた後、次のようKeyDownに を使用して、ウィンドウのイベント (または任意のイベント)にアタッチします。Window.GetWindow(this)

XAML

<UserControl Loaded="UserControl_Loaded">
</UserControl>

コードビハインド

private void UserControl_Loaded(object sender, RoutedEventArgs e) {
  var window = Window.GetWindow(this);
  window.KeyDown += HandleKeyPress;
}

private void HandleKeyPress(object sender, KeyEventArgs e) {
  //Do work
}
于 2013-02-15T02:40:15.597 に答える
29

私は同じ問題を抱えています。さまざまなページにロード/ナビゲートするフレームをホストするウィンドウがあります。このウィンドウには、通常のコントロール/要素(ラベル、ハイパーリンクなど)を含むUserControlが1つだけ含まれています。

私が発見したのは(もちろん数時間のフラストレーションの後!!!)、上記のコントロール/要素の1つにフォーカスがない場合、PreviewKeyDownイベントはUserControlで発生しません(フレームレベルで停止します)。コントロールの魔法の1つにフォーカスを置くと(たとえば、UserCotrolのLoadedイベントハンドラー内でctrl.Focus()を呼び出すと)、それが機能し、UserControlに対してもイベントが発生します。

もちろん、後でそれを考えると、これは十分に理にかなっていますが、これは10人のうち少なくとも5人を驚かせることになると100%確信しています:)WPFと呼ばれるクレイジーな小さなもの...

乾杯!

于 2009-06-11T11:10:38.260 に答える
24

PreviewKeyDown イベントは、バブリング イベントではなく、トンネリング ルーティング イベントだと思います。その場合、Page がイベントを取得していない場合、UserControl はビジュアル ツリーの Page の下にあるため、イベントを取得することはできません。アプリの最上位レベル (おそらく Window?) で処理してみて、イベントを取得しているかどうかを確認してください。

役立つ可能性のある別のオプションは、CodePlex で Snoopなどを使用して、イベントがどこに行くのかを把握することです。

于 2008-12-07T16:26:32.647 に答える
13

UserControl で Focusable プロパティを true に設定すると、問題が解決しました。

于 2011-12-09T16:09:15.543 に答える
1

ウィンドウのイベントにアタッチしたくない場合は、UserControl または Page の変更を表示するためのイベントを追加します。

IsVisibleChanged="Page_IsVisibleChanged"

次に、コードビハインドで:

private void Page_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if(this.Visibility == Visibility.Visible)
            {
                this.Focusable = true;
                this.Focus();
            }
        }

いずれかのキーを押すと、イベント KeyDown が発生します。

于 2019-08-25T18:09:12.770 に答える
1

イベントを簡単に使用できますWeindow_KeyDown

ここに例があります

private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            // ... Test for F1 key.
            if (e.Key == Key.F1)
            {
                this.Title = "You pressed F1 key";
            }
        }

Weindow_KeyDownWindow タグに属性を追加することを忘れないでください

<Window x:Class="WpfApplication25.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        KeyDown="Window_KeyDown">
</Window>
于 2019-07-24T11:06:36.043 に答える
0

ビューのボタンで .Focus() を呼び出すだけでこの問題を修正し、ウィンドウがすべての要素の読み込みを完了したことを確認しました

于 2021-07-29T07:40:29.547 に答える
-1

これはテスト済みで、確実に機能します。

  Private Sub textbox1_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles textbox1_input.PreviewKeyDown
        If (e.Key = Key.Down) Then
            MessageBox.Show("It works.")
        End If
    End Sub

'detect key state directly with something like this below
 Dim x As KeyStates = System.Windows.Input.Keyboard.GetKeyStates(Key.Down)

PreviewKeyDown は、ほとんどの人が見逃しているものです。PreviewKeyDown をキーボード イベントの全体的なオブザーバーと考えてください (ただし、間違っていなければ影響を与えることはできません)。KeyDown イベントは、現在のコントロールまたはクラスの範囲内でリッスンされています。

于 2016-01-03T00:16:51.113 に答える