問題タブ [routedevent]
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.
wpf - トンネリングイベントにアタッチされたこのクラスハンドラーがインスタンスハンドラーの前に起動しないのはなぜですか?
このMSDNの記事(とりわけ)によると、
クラスハンドラーは、ルーティングされたイベントがそのルート内の要素インスタンスに到達するたびに、そのクラスのインスタンスにアタッチされているインスタンスリスナーハンドラーの前に呼び出されます。
私はRoutedEvent
sにまったく慣れていないので、コードに間違いがある可能性がありますが、RoutedEvent
として宣言されたにアタッチされたクラスハンドラーは、同じイベントにアタッチされたインスタンスハンドラーの前に常に起動するとは限らないRoutingStrategy.Tunnel
ようです。
TouchButton
以下の例では、トンネリングRoutedEvent
とバブリングを使用してコントロールクラスを作成しましたRoutedEvent
。それぞれにクラスハンドラーを登録しました。次に、ウィンドウにクラスのインスタンスを作成し、コードビハインドで各イベントを処理します。クラス要素とそれを含むの両方で、トンネリングイベントに同じハンドラーをアタッチしましたGrid
。4つのハンドラーすべてに名前が表示さMessageBox
れるため、実行の順序を明確に確認できます。
- グリッドインスタンスPreviewTouch
- クラスTouchButton_PreviewTouch
- TouchButtonインスタンスPreviewTouch
- クラスTouchButton_Touch
- タッチボタンインスタンスタッチ
これはe.Handled = true;
、クラスPreviewTouch
イベントハンドラーを呼び出すと、要素にアタッチされているものを除いて、実行が他のすべてのイベントハンドラーに到達するのを停止できることを意味しGrid
ます。これはこんな感じなのか、どこかで間違えたのか?それ以外の場合、実行がすべてのインスタンスイベントハンドラーに到達するのを停止するにはどうすればよいですか?
クラスは次のとおりです。
背後にあるウィンドウコードのインスタンスハンドラは次のとおりです。
コントロールXAMLは次のとおりです。
トンネリングイベントは、Grid
要素に「トンネリング」する前に要素によって処理されることを理解してTouchButton
いますが、クラスハンドラーは常にインスタンスハンドラーの前に起動することになっていると思いました。そうでない場合、どうすればこれを達成できますか?
更新>>>
@sanguineの回答のおかげで、すべてのインスタンスハンドラーがイベントを処理しないようにする方法を見つけることができました。宣言されたクラス処理タイプをTouchButton
sanguineGrid
が提案したように置き換える代わりに、に置き換えると、すべての派生コントロールFrameworkElement
をキャッチします。FrameworkElement
c# - ContentTemplate を介してスタイル トリガーで生成されたフォーカス要素
WPF での作業 ダブルクリックすると、編集可能な TextBox に「変換」される TextBlock を生成しようとしています。その後、Enter キー、Esc キー、またはフォーカスを失うと、編集が終了し、TextBox が TextBlock に戻ります。
私が見つけた解決策はほとんど機能しています。私の問題は、「変換」に TextBox をフォーカスできないため、ユーザーが要素をもう一度明示的にクリックしてフォーカスし、編集を開始する必要があることです。
コードの説明
この動作を実装するために選択した方法は、要素のテンプレートを変更するために、テンプレートとスタイルの DataTriggers を操作することです。私が示す例では、要素は単純な ContentControl ですが、これを実行しようとしている実際の使用例は少し複雑です (私は ListBox を持っており、この動作を通じて各要素を一度に 1 つずつ編集できます)。 )。
アイデアは次のとおりです。
- ContentControl には関連付けられた Style があります
- 関連する Style は、ContentTemplate を TextBlock として定義します。
- モデル オブジェクトにはプロパティ InEditing があり、コントロールを編集するときに true になります。
- TextBlock の MouseBinding を介して、モデルの InEditing プロパティを True に設定します。
- スタイルには、InEditing をリッスンする DataTrigger があり、この場合、ContentTemplate を TextBox に設定します。
- EventSetters を通じて、Enter、Esc、および LostFocus をキャッチして、変更を保存し、以前のスタイルに戻します。よく注意してください: イベントを TextBox に直接添付することはできません。代わりに EventSetter を使用してください。
最適ではありませんが (特に InEditing プロパティでは、ビューとモデルの動作の特定の組み合わせがあり、KeyDown と LostFocus のさまざまなハンドラーを介して TextBox のモデルへの変更のコミット ロジックを大幅に再実装するのは好きではありません)。 )、システムは実際に問題なく動作します。
失敗した実装アイデア
最初は、TextBox の IsVisibleChanged イベントに接続して、そこにフォーカスを設定することを考えました。前述の理由により、実行できませんStyle 内の Target タグにイベントを指定することはできません。代わりに EventSetter を使用してください。
このようなイベントはルーティング イベントではなく、EventSetter では使用できないため、エラーによって提案された解決策は使用できません。
コード
コードは 4 つのファイルに分割されています。
Model.cs:
アプリ.xaml:
MainWindow.xaml:
MainWindow.xaml.cs
wpf - 奇妙なKeyUpの動作(メインフォームは子からのイベントを処理しますか?!)
問題:
- KeyUpは、メインウィンドウのグリッドによって処理されます(
Grid_KeyUp
) - メインウィンドウには子ウィンドウが表示されます(例
MessageBox.Show(...)
) - ユーザーが[Return](
Keys.Return
)を押して、MessageBox
- メインウィンドウは、実際にはMessageBoxのそのキー押下からKeyUpイベントを取得します
私が抱えている問題を示す非常に単純な分離サンプルがあります。空のWPFプロジェクトを作成し、次のXAMLを使用するだけです。
そして、コードビハインド:
ボタンをクリックして[Return]を押してメッセージボックスを閉じると、出力ウィンドウに次のように出力されます。
奇妙な事実:
- [Escape](
KEYUP: Escape
印刷される)を押しても同じ動作をしますが、[Space]を押すとコンソールは何も印刷しません! - e.Sourceとe.OriginalSourceは、メインウィンドウのボタンを指しています(これは明らかに間違っています)。
MessageBox.Show(...)
イベントがoutKeyUpハンドラーによって処理されない(つまり、出力が空である)直後にブレークポイントを設定した場合。
誰かが私に何が起こっているのか説明してもらえますか?
PSターゲットフレームワークは次のとおりです。.NET4クライアント
c# - 異なるビュー間でのデータの受け渡し
MVVM モデルに従って、C# で WPF アプリケーションを作成しています。MenuView、ContentView1、ContentView2、などのいくつかのビューで構成される MainWindow があります。. . 等々。
MenuView、ContentView1、ContentView2 。. .、XAML ツリー内のすべてのいとこ(気にしない) です。
MenuView はいくつかのボタンで構成されています。各ボタンには一意の ID があります。コンテンツ ビュー (すべて) は、選択された (クリックされた) ボタンのメニュー ID を受け取る必要があります。つまり、MenuView のボタンがクリックされたときに、その ID を ContentsViews1、ContentsViews2 などに渡したいとします。
ビュー間でデータを渡す最善の方法がわかりません。
MenuView に存在するすべてのメニュー ボタンにイベント ハンドラーをアタッチすることを考えました。ハンドラーは MainWindow クラス (ルート ビュー) に実装されます。このハンドラーは、すべての子ビューに対して (トンネル オプションを使用して) RoutedEvent を発生させます。
それを行うより良い方法はありますか?パフォーマンスの問題を考えると最善の方法ですか?
c# - UserControl のカスタム RoutedEvent が見つかりません
XAML デザイナーに問題があります。
カスタム ProgressBar を表す UserControl があります。状態に基づいていくつかの色を持つ回転する円です。これは UserControl を拡張し、ローカル名前空間を XAML ファイルに追加して、「ローカル」という名前を付けました。
コード ビハインドでは、次のようなカスタム イベントを作成しました。
私の XAML ファイルには、いくつかのアニメーションを接続するための EventTrigger があります。
ただし、これによりエラーが発生します。イベント 'NotStartedEvent' がタイプ 'UserControl' に見つかりませんでした。
私はウェブを検索しましたが、私が間違っていることを見つけることができませんでした.それは愚かな詳細に違いありません. たとえば、EventTrigger が UserControl.Triggers の下にあるためですか?
プロジェクトのクリーニングと再構築を数回試みましたが、これは正常に機能します。XAML デザイナーだけがこのエラーを出しています。
wpf - CommandTargetはどこにありますか?
私はまだコマンドとRoutedEventsで経験を積んでいます。RoutedCommandsを使わずに、とてもシンプルなプログラムを実現しようとしています。
これが私のコマンドクラスです:
そのコマンドに静的にアクセスできるようにするために、すべてのコマンドを保持するための静的クラスを作成しました。
これは、私のMainWindow.xamlにあるものです。
私が欲しいのは、menue1-itemをクリックすると、「mainTextBox」の背景が変わることです。それでは、私のMainWindow.csの内部を見てみましょう。
プログラムは機能していますが、正しくありません:)常にメインウィンドウの背景を変更しますが、コマンドターゲットの背景は変更しません。
だから-私は何が間違っているのですか?何か忘れましたか?
wpf - wpf キーバインディングを実装するにはどうすればよいですか
ユーザーが実行時にホットキーを変更できるようにしたいと考えています。
これを達成するためにcodebehind C#でキーをバインドする方法に関する具体的な例はありますか?
RoutedCommand でキーバインディングを行う必要があると思います。ホットキーで UI のボタンを押したいとします。
例... ユーザーが F5 を押してアプリの btnGo をクリックできるようにします。
wpf - WPFボタンEventTrigger=Button.IsEnabledChanged
ボタンの色の変更(IsEnabledプロパティに基づく)を2つの方法でアニメーション化したいと思います:1)ボタンが有効から無効に変更されたとき->色が白から黒に変更されます。2)無効から有効に変更すると->色が黒から白に変更されます。
RoutedEventでEventTriggerを使用しようとしていますが、Buttonという名前のイベントは1つだけです。IsEnabledChanged。
ロジック状態に基づいてIsEnabledプロパティが変更されるボタンがあります。ステートマシンは動作していますが、ボタンが有効または無効になったときにボタンの色を(ColorAnimationを使用して)変更したいと思います。
そうするための最良の方法は何ですか?
c# - 誰が私のイベントを処理したか
TextBox の LostFocus イベントに登録しましたが、イベントがキャッチされません。他の誰かがそれを処理したと思います。snoop を使用してみましたが、MouseDown イベントと MouseUp イベントしか表示されません (LostFocus が必要です)。どうすれば見つけられるかについてのアイデアはありますか?
ありがとう
更新:それほど明確ではありませんが、登録するコードは次のとおりです。
eventInfo.AddEventHandler(cloningObject, eventDelegate);