問題タブ [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 - wpftoolkit datepickerがリターンキーダウンイベントを食べるのはなぜですか?
日付ピッカーが標準キーを親コントロールのキーダウンルーティングイベントに渡すが、リターンキーは渡さない理由を誰かが知っているのだろうか?
これが私が書いたxamlです:
リターンキーをチェックするために使用していたコードは次のとおりです。
私は偶然にキーダウンを使用していましたが(キーアップを使用することを意味します)、標準の数字と/文字がロジックを起動していましたが、リターンキーは起動していなかったのは興味深いことでした。リターンキーがキーダウンキーとして含まれていない理由は何ですか?
.net - ウィンドウのネストされた子の SourceUpdated をキャッチする方法は?
ウィンドウの入力要素のバインディング ソースがいつ更新されるかを知りたいです。
入力要素は、TextBox、RadioButton、Slider、ComboBox などであり、UserControls または Panels 内にネストすることができます。
SourceUpdated をキャッチするのはいいことですが、これはルーティング イベントではないため、親にバブリングされません。
これを行う簡単な方法はありますか?
wpf - RoutedEvent 名は既に使用されています
WPF で、「ユーザー構成」、「システム構成」、「アカウント構成」の 3 つの UserControls を作成しました。これらすべてのユーザー コントロールには、[保存] ボタンと [キャンセル] ボタンがあります。これらのボタンをクリックすると、それぞれのクラスで宣言および定義されたルーティング イベントが発生します。保存ボタンをクリックすると「ConfigurationSaved」イベントが発生し、キャンセル ボタンをクリックすると「ConfigurationCancelled」イベントが発生します。
これらのイベントが発生すると、ユーザー コントロールをホストするコンテナーが構成を保存します。
すべてのクラスのルーティング イベント定義のコード スニペットは次のとおりです。
AccountConfigurationView:
システム構成ビュー:
ユーザー構成ビュー:
これらのクラスを使用していると、次のメッセージで TypeInitializationException が発生します。
OwnerType 'baskcode.Admin.Controls.AccountConfigurationView' の RoutedEvent 名 'ConfigurationSaved' は既に使用されています。
他のコントロールを読み込もうとすると、同じ例外がスローされます。問題を修正することはできません。この点で私を助けてください。
私は.Netバージョン4を使用しています
ありがとう。
wpf - Rx と F# を使用して WPF Button.Click イベントを Observable に変換する方法
イベントIObservable
から作成する C# コードを複製しようとしています。Button.Click
このコードを F# に移植したいと考えています。
エラーなしでコンパイルされる元の C# コードを次に示します。
F# で同じことをしようとして失敗したのは次のとおりです。
ステートメントの 2 行目を除いて、すべてが満足しています。
F# コンパイラは、コンストラクターへのパラメーターとしてfun h -> RoutedEventHandler(h)
を除きたくないため、不平を言います。h
RoutedEventHandler
一方、C# コンパイラは問題なく受け入れられるようです。h => new RoutedEventHandler(h)
興味深いことに、両方のコード サンプル (C# と F#) で、 の型h
はEventHandler<RoutedEventArgs>
.
F# コンパイラから得られるエラー メッセージは次のとおりです。
エラー 2 この式はタイプ obj -> RoutedEventArgs -> unit を持つことが期待されていましたが、ここではタイプ EventHandler を持っています
RoutedEventHandler
PresentationCore 内で見つけた署名は次のとおりです。
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
ご覧のとおり、パラメーターとしてobject
andを使用するため、F# コンパイラーは実際には正しいものです。RoutedEventArgs
C# コンパイラが舞台裏で行う魔法で、F# コンパイラでは機能しないものがありますか、それともここで何かが欠けているだけですか?
いずれにせよ、どうすればこれを F# で機能させることができますか?
wpf - WPF:ComboBoxのCheckBox.CheckedイベントがToggleButtonとして発生しないようにする方法は?
チェックボックスやコンボボックスなど、ウィンドウに多くのコントロールがあります。CheckBox.IsChecked イベントを追跡したいので、Windows レベルでイベント ハンドラーを次のように定義しました。
問題は、項目をマウスでクリックした直後に ComboBox によって同じイベントが発生することです。イベント ハンドラーは、ToggleButton ではなく、CheckBox の Checked イベントのみをキャプチャする必要があると考えました。何か見逃しましたか?
編集: 以下で指摘したように、Matthew MacDonald の本「Pro WPF in C# 2010」を読んだので、このように機能すると思いました。164 ページで、彼はこのサンプル コードを最初に示しました。
次に、彼は特に次のように指摘しました。
注 Click イベントは、実際には ButtonBase クラスで定義され、Button クラスによって継承されます。イベント ハンドラーを ButtonBase.Click にアタッチすると、ButtonBase から派生したコントロール (Button、RadioButton、および CheckBox クラスを含む) がクリックされたときに、そのイベント ハンドラーが使用されます。イベント ハンドラーを Button.Click にアタッチすると、それは Button オブジェクトに対してのみ使用されます。
さて、私は彼を誤解しましたか、それとも彼のメモは間違っていますか?
c# - WPF 添付イベントと非添付イベント
問題は、すべての調査を行った後でも、通常のルーティング イベントと添付イベントの違いを見つけることができないということです。機能的な違いは何ですか?または、他の人は何もないと同意しますか?
実装
ButtonBase クラスは、ClickEvent という名前のルーティング イベントを宣言します。通常のルーティング イベント。
Mouse クラスは、MouseDownEvent という名前のルーティング イベントを宣言します。付属のイベント。
どちらのイベントも EventManager に登録され、パブリック、静的、読み取り専用のフィールドとして同じ方法で保存されます。ClickEvent には、base.AddHandler と base.RemoveHandler をそれぞれ呼び出すカスタムの add アクセサーと remove アクセサーを備えたバッキング CLR イベント フィールドがあります。どちらも、ButtonBase の派生元である UIElement 基本クラスで宣言されています。代わりに、MouseDownEvent には AddMouseDownHandler と RemoveMouseDownHandler の 2 つの静的メソッドがあり、最終的に ClickEvent と同様に UIElement で宣言された同じ 2 つの AddHandler と RemoveHandler メソッドを呼び出します。
静的クラスで宣言された実際の添付イベントの Add*Handler および Remove*Handler 静的メソッドは、特定の命名規則に従って、WPF イベント システムがリフレクションを使用して実行時に適切な追加および削除ハンドラーを見つけられるようにする必要があります。
使用法
どちらのイベントも、次のように XAML でハンドラーをアタッチできます。
両方のイベントは、次のコードで添付できます。
ご覧のとおり、どちらのイベントも、それらを所有または宣言していない要素に関連付けることができます。
結論 - 添付イベントとは
MSDN ドキュメントの状態: http://msdn.microsoft.com/en-us/library/bb613550.aspx
Extensible Application Markup Language (XAML) は、言語コンポーネントと、添付イベントと呼ばれるイベントの種類を定義します。添付イベントの概念により、特定のイベントのハンドラーを、実際にイベントを定義または継承する要素ではなく、任意の要素に追加できます。この場合、イベントを発生させる可能性のあるオブジェクトも、宛先処理インスタンスも、イベントを定義または「所有」しません。
さらに、試験 70-511 用の公式 MCTS トレーニング キット - Microsoft .NET Framework 4 を使用した Windows アプリケーション開発には、次のように記載されています。
コントロール自体では発生できないイベントのハンドラーをコントロールで定義することができます。これらのインシデントは、添付イベントと呼ばれます。たとえば、グリッド内のボタン コントロールについて考えてみましょう。Button クラスは Click イベントを定義しますが、Grid クラスは定義しません。ただし、XAML コードで Button コントロールの Click イベントをアタッチすることにより、グリッド内のボタンのハンドラーを定義することもできます。
「添付イベント」という用語は、Microsoft の学習リソース全体であいまいに思われますが、ここでは、添付イベントと XAML 添付イベント構文という 2 つの異なるが非常に密接に関連する概念が使用されていることは明らかです。私が引用した両方の Microsoft ソースは、実際の添付イベントではなく、XAML 添付イベントの構文を参照しているようです。ただし、添付イベントの概要の MSDN ページには、実際の添付イベントを実装する方法が示されていますが、トレーニング キットにはありません。
Mouse.MouseDownEvent は、対応する静的な追加および削除ハンドラーを使用して静的クラスで宣言されたルーティング イベント (添付イベントとも呼ばれます) の例です。ただし、ButtonBase.ClickEvent は通常のルーティング イベントですが、実際の添付イベントと同じ方法で XAML 添付イベント構文で引き続き使用できます。
実際の添付イベントの目的は、開発者が既存の UIElement 派生クラスの新しいルーティング イベントをサブクラス化せずに宣言できるようにすることです。つまり、発生させたり処理したいクラスに実際に存在することなく、新しいルーティング イベントをアタッチすることができます。しかし、ちょっと待ってください... そもそもそれが純粋なルーティング イベントの主な目的ではないでしょうか。
MSDN のルーティング イベントの概要ページ: http://msdn.microsoft.com/en-us/library/ms742806.aspx
機能の定義: ルーティング イベントは、イベントを発生させたオブジェクトだけでなく、要素ツリー内の複数のリスナーでハンドラーを呼び出すことができるイベントの一種です。
その機能定義から、ルーティング イベントは基本的に添付イベントとまったく同じ機能を提供するように見えます。したがって、基本的に添付イベントは、静的クラスでルーティング イベントを宣言するための単なる手段であり、通常のルーティング イベントよりもメリットはありません。
ここで何かが足りないかもしれないので、あなたの考えを教えてください。
ありがとう、ティム・バレンタイン
c# - CanExecuteRoutedEventHandler を単体テストする方法は?
次のコードの単体テストを作成しようとしています。
このコードの問題は、CanExecuteRoutedEventArgs 型のモック インスタンス (封印されたクラス) またはインスタンス (内部コンストラクター) を作成できないことです。
以下を試してみましたが、次のコードは両方とも実行時例外をスローします。
ご関心をお寄せいただきありがとうございます。
routedevent - トンネリング イベントの引数オブジェクトとバブリング イベントの引数オブジェクトが等しくないのはなぜですか?
私は 70-511 の本を読んでいて、ルーティング イベントのセクションを見ています。バブリングとトンネリングのイベントのペアが同じ EventArgs インスタンスを共有していることに気付いたので、トンネリング イベント (PreviewMouseDown など) を処理すると、ペアのバブリング イベント (MouseDown など) が停止します。私はこれを試してみましたが、動作します...しかし、イベントハンドラーが起動するたびに等しいかどうかをテストすると(テスト目的で、両方のイベントに1つのイベントハンドラーを使用しています)、EventArgsが同じインスタンスではないように見えます(つまり、それらは異なるハッシュ値を持ち、Object.Equals は false を返します)... これがなぜなのかを理解できれば、ルーティング イベントがどのように機能するかについての理解が大幅に向上します。
説明したい .NET 専門家はいますか?
私は Pro WPF の本 (優れた本) をチェックしましたが、これも次のように述べています。 RoutedEventArgs クラスの同じインスタンスです。」
2 つのイベントがクラスの同じインスタンスを共有している場合、eventargs は同じハッシュ値を持ち、Object.Equals に対して「True」を返すべきではありませんか?
XAML:
c# - ハンドラーの孫としてRoutedEventSourceを取得します
WPFアプリケーションでユーザー入力を処理し、RoutedEvents
などを操作しています。MSDNのルーティングイベントの概要からトンネリングとバブリングを十分に把握していますが、バブリングイベントで問題が発生しました。MouseDown
MouseMove
MouseDown
イベントがハンドラーにバブルアップすると、MouseButtonEventArgs.Source
イベントが発生した現在の要素の子が表示されます。その要素の子を取得する方法はありますか?私は方法で何かを考えていますMouseButtonEventArgs.Source.Source
この場合、入力処理をアプリケーションのできるだけ上に置きたいのですが、それでもイベントが発生した最初の要素に関する情報を取得します。
以下の例:ここで、Grid
名前の付いた孫がクリックされ、でイベントを処理したいと思いますParent_MouseDown()
。ただし、その場合、イベントのソースについて取得するすべての情報は、grid
名前付きの子に関するものです。親から孫に関する情報を入手する方法はありますか?
私のアプリケーションでは、これらの要素は異なるクラスであり、異なるファイルに存在するため、この例は単純化されていることに注意してください。前もって感謝します!
c# - その場で作成された子要素からのルーティング イベントを使用するにはどうすればよいですか?
子コントロールの 1 つからルーティング イベントとして発生するイベントが MainWindow にあります。MainWindow には、ルーティングされた発火をキャッチするための AddHandler 呼び出しがあります。
別の子要素からこの同じイベントを発生させたいのですが、この要素 (menuItem) はオンザフライで作成されるため、MainWindow で AddHandler を使用しようとすると、次のようになります。
MyMenuItem がまだ存在しないため、null 引数の例外が発生します。
ルーティング イベントを引き続き使用できる方法を知っている人はいますか?