問題タブ [event-routing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - MSDN の記事にあるように、ボタン クリック イベント「ビジュアル ツリーをバブルアップ」しないのはなぜですか?
MSDN の記事Understanding Routed Events and Commands In WPFでは、次のように述べています。
イベントは、処理されるかルート要素に到達するまで、ソース要素からビジュアル ツリーをバブル (伝播) します。
ただし、この例では、ボタンをクリックしても、親の StackPanel イベントによって処理されるように「ビジュアル ツリーをバブルアップ」しません。つまり、ボタンをクリックしてもイベントは発生しません。
なぜだめですか?そうでない場合、「泡立つ」とはどういう意味ですか?
XAML:
コード ビハインド:
wpf - InvokeCommandAction がイベントを親要素に伝播しないようにするにはどうすればよいですか?
EventTrigger に関連付けられた InvokeCommandAcction を使用すると、元のイベントが処理されるまで親要素にルーティングされていることに気付きました。うーん、これは想定内の動作だと思います。しかし、私の質問は、イベントを処理済みとしてマークして、UI ツリー全体に伝播しないようにする方法です。
実際には、このイベントをコマンドで処理すると、すべてがこのコマンドで処理されるため、伝播する必要はありません。そして、私が見つけたあるコーナーケースでは、それはいくつかの望ましくない動作を引き起こします. たとえば、ユーザーが要素をダブルクリックすると (MouseDoubleClick イベント)、新しいウィンドウが開きます。問題は、MouseDoubleClick イベントが UI ツリーの最上位要素に到達したばかりであるため、新しいウィンドウが開き、メイン ウィンドウが新しいウィンドウの前に戻ってくることです。必要な動作は、新しいウィンドウを前面に保持することですが、InvokeCommandAction によってイベントが伝播されるため、メイン ウィンドウがフォーカスを取り戻します...
私ができることは、代わりに CallMethodAction アセットを使用することですが、私は MVVM シナリオにいるので、コードに UI イベント引数は必要ありません。これにより、暗黙的にイベントを処理済みとしてマークし、問題を修正できたとしても。
c# - WPF で TextBox から MainWindow への KeyDown イベントのバブリングを防止する
テキスト ボックス コントロールを含むプログラムがあります。ユーザーは、このコントロールにテキストを入力できます。ユーザーは、特定のキーを押して他のアクションをトリガーすることもできます (これは MainWindow で処理されます)。セットアップを示すサンプル XAML および C# コードがあります。
XAML
C#
お気づきかもしれませんが、このプログラムの場合、最初TextBox
のプログラムに入力を開始すると、2 番目のプログラムのヒット カウントが更新されます。OnKeyDown
MainWindow のメソッドを処理するときにトリガーしたい特定のアクションがある可能性があるため、これは望ましくない結果です。
OnKeyDown
そのため、私の質問は次のとおりです。テキスト ボックスにテキストを入力できるようにしながら、MainWindow でメソッドが呼び出されるのを防ぐことは可能ですか? 私はe.Handled = true
アプローチを知っていますが、この場合、KeyDown
イベントでそれTextBox
を行うと、テキストが入力されなくなります。これが不可能な場合は、すべてを処理する別の方法を見つける必要があります。
前もって感謝します。
編集
この問題を回避する適度にハックな方法を見つけました。代わりにMainWindow のOnTextInput
メソッドを処理するTextInput
と、意志のイベントTextBox
が処理されるため、目的の結果が得られます。以下は、私が使用したコードのサンプルです。
c# - MainWindow の PreviewKeyDown から WPF キーボード イベントを子 DataGrid にルーティングする
いくつかの単一行の Textboxes と 1 つの DataGrid (Windows8 の .Net 4.5) を含むウィンドウがあります。
どのコントロールにフォーカスがあるかに関係なく、ナビゲーション イベント (Up/Down/PgUp/PgDn など) をグリッドにルーティングしたいと考えています。
次のように、メイン ウィンドウで PreviewKeyDown をオーバーライドしようとしました。
問題は、イベントが に反映され続けるため、StackOverflowException が発生することWindow_PreviewKeyDown
です。
次の[醜い]回避策を試しました:
に置き換えることif ( bEventRaised )
をお勧めしif ( sender == myDataGrid )
ますが、残念ながら、送信者は常にメイン ウィンドウです。
それにもかかわらず、これは私をもう少し先に進めました。キーボード イベントが に到達するのを確認できるようになりましmyDataGrid.PreviewKeyDown
たが、それでも myDataGrid 内でイベントが発生しません。
私が何を間違っているのか、またはイベントを子 DataGrid にルーティングする別の方法があるかどうかを理解する助けが欲しいです。
ありがとう。
wpf - ListBox ItemTemplate 内のボタンがアイテムを選択していない wpf mvvm
こんにちは、私はここと同じ問題を抱えています ListBox ItemTemplate 内のボタンがアイテムを選択していません そして、ボタンが選択されたアイテムを表示しない理由を知っています。しかし、XAMLを修正する方法がわかりません
C#