.NET UserControl の MouseLeave の奇妙な動作
-
21-08-2019 - |
質問
クリック可能なピクチャボックスをボタンとして持つ userControl (.NET 1.1 Winforms) があります。
これらのユーザー コントロールを同時に表示しているので、マウスがユーザー コントロール上にあるときにピクチャー ボックスを表示し、それ以外の場合は非表示にできればよいのではないかと考えました。
これを行うには、UserControl の MouseEnter イベントと MouseLeave イベントを処理し、ピクチャボックスを非表示にしたり表示したりします。それはうまくいきます。
しかし、クリック可能なピクチャボックスが表示されると、それをクリックできなくなります(ハンドカーソルが消え、クリックイベントが発生しません)。
いくつかのテストの後、私のピクチャーボックスで何かを行う MouseLeave ハンドラーのすべてのコンテンツをコメントするとわかります...このようにして、ピクチャボックスをクリックできるようになります。
正しいイベントを使用していませんか?
これを達成する別の方法はありますか?
コードは次のとおりです...
Private Sub NodoEstablo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.pictAdd.Visible = False
End Sub
Private Sub NodoEstablo_MouseEnters(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
Me.pictAdd.Visible = True
End Sub
問題のあるイベント ハンドラー:
Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
Me.pictAdd.Visible = False
End Sub
アップデート:MouseLeaveでピクチャボックスのサイズを変更すると(何かをするためだけに)、それは機能します。これまでのところ、MouseLeave で Visible と Location を変更すると、ピクチャボックスをクリックできなくなります。:S
解決
マウスがボタンの上に移動すると、次のようなことが起こります。
- マウスが (まだコントロール内にあるにもかかわらず) ユーザー コントロールを離れ、ピクチャーボックスに入ります。
- あなたの
MouseLeave
イベントハンドラが起動し、ピクチャボックスが表示されなくなります
- あなたの
- ピクチャーボックスが表示されていないため、マウスはピクチャーボックスから出てユーザーコントロールに入ります。
- あなたの
MouseEnter
イベントハンドラが起動し、ピクチャボックスが表示されます。
- あなたの
- 画像ボックスが表示されるようになったので、プロセスは最初からやり直します。
コードをテストしたところ、「ボタン」が継続的に点滅し(表示が切り替わり続けたため)、クリックを記録できるほど長く表示し続けることができませんでした。
これに対処する 1 つの方法は、 MouseLeaves
ハンドラーは次のようになります。
Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.MouseLeave
If Not ClientRectangle.Contains(PointToClient(Cursor.Position)) Then
Me.pictAdd.Visible = False
EndIf
End Sub
これは、ボタンを非表示にする前に、マウスが実際にコントロールから離れたかどうかを確認します。
ピクチャボックスのサイズを変更すると、上で概説したサイクルが壊れる可能性がありますが、根本的な問題は解決されません。
(質問とは関係ありませんが) 他に考慮すべき点がいくつかあります。
- をオーバーライドすることをお勧めします
OnMouseLeaves
, 、対応するイベントをサブスクライブする代わりに、ユーザーコントロール内のメソッドを使用します。 - この方法でコントロールを処理すると、キーボードのみでアプリケーションを使用できなくなる可能性があることに注意してください。(すなわち、ユーザーはできません タブ ボタンに合わせて押してください 入力)