2017-12-15 10 views
0

マウスイベントに関する疑問があります。私が話しているのはMouse_Clickイベント、PreviewMouse_Downイベント、MouseDownイベントです。私は、MSDNでこれらのイベントについての説明を読んでいると、まだ私はこれまでのところ、私が知っていることから、これら3c# - MouseEventの理解

を区別するに苦労しています:たとえば

Click : Occurs when the control is clicked by the mouse. 
Preview: Occurs when any mouse button is pressed while the pointer is over this element. 
Mousedown: Occurs when the mouse pointer is over the control and a mouse button is pressed. 

、私はどのイベントか分かりません説明に基づいて、彼らは私とほとんど同じように見えます。その上に、マウスの左ボタンが押されたときに発生するPreviewMouseDownがあります。それらはすべて同じですか?誰かがこれについていくつかの光を当てることができますか?

答えて

3

すべて同じではありませんか?

短い答えは、「ユースケースによって異なりますが、同じ機能を果たすことができます」

誰もがこれにいくつかの光を当てることができますか?

どのように違いますか?

まず、イベントが定義されている基本クラスを見てみましょう。

MouseDownPreviewMouseDownSystem.Windows.UIElement
ClickからであるSystem.Windows.Controls.Primitives.ButtonBaseからです。

UIElementは、より多くのクラスがそれから派生することを意味するButtonBaseより高い抽象です。つまり、複数のクラスはMouseDownPreviewMouseDownイベントがありますがないClickイベント

はまた、UIElementは、このようにButtonBaseMouseDownPreviewMouseDownイベントを持っているからButtonBase自体が派生していることに注意してください。

しかしButtonBase.Clickのドキュメントに記載されているように:

ButtonBaseOnMouseLeftButtonDown方法で取り扱うようMouseLeftButtonDownイベントをマークし、Clickイベントを発生させます。したがって、ButtonBaseを継承するコントロールでは、OnMouseLeftButtonDownイベントは発生しません。

これは、どのようにしてButtonBaseでイベントがどのように発生したのですか?

以下の説明は、唯一の3つのイベント(PreviewMouseDownMouseDown、およびClick)を考慮することに注意してください。上記の3つのイベントの前/間/後に他のイベントが関与することがありますが、議論の目的では無視されます。

PreviewMouseDownは、マウスボタン(左または右)を押した直後に常に最初に起動します。

MouseDown右クリックを使用すると次に発生します。

Clickを使用すると、次の発生しますが、Click、マウスの左ボタンもButtonBaseにフォーカスがあると、ユーザーがEnterキーを押すか、スペースキーとき、追加するにはButtonBase

にリリースされた場合だけを左クリック火災ではなくPreviewMouseDown

MouseDownPreviewMouseDownイベント(基本的にはXXXイベントとPreviewXXXイベント)との差に全く新しい議論がありますされます。そのトピックに進むには、Routed Eventsのドキュメントを参照してください。

+0

ありがとうございます。だから、もし私がボタンを持っていて、ボタン効果を持たせたいのであれば、どちらを使うべきですか?私はMouseDownイベントを使用してみましたが、効果は機能しませんでしたが、PreviewMousedownやClickイベントを試してみると効果があります。私は混乱しています。 –

+0

探しているボタンの効果はわかりませんが、ButtonBaseクラス、またはその派生クラス/コントロール(Button、ToggleButtonなど)が既に実装していると思います。いいえ、ホイールを再開発する必要はありません。 –

+0

XAMLで実装されたボタンでマウスイベントを使用しようとしましたが、私が望む効果が得られません。 Strange –

0

私が知る限り、それはイベントトンネリングとバブリングに関連しています。

イベントの順序があります。

ボタンがあるとします。 ボタンをクリックしたままにすると、の順番でイベントが発生します。

ダウン1)プレビューマウス左ボタン

2)プレビューマウスダウン

3)マウス左ボタンダウン

4)マウスダウン

5)プレビューマウス左ボタンアップ

6)プレビューマウスアップ

アップの詳細については

8)マウスアップ

7)マウスの左ボタン、イベントトンネリングを参照し、深くバブリングしてください。 http://csharphelper.com/blog/2015/03/understand-event-bubbling-and-tunneling-in-wpf-and-c/