質問

クリック可能なピクチャボックスをボタンとして持つ 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

役に立ちましたか?

解決

マウスがボタンの上に移動すると、次のようなことが起こります。

  1. マウスが (まだコントロール内にあるにもかかわらず) ユーザー コントロールを離れ、ピクチャーボックスに入ります。
    • あなたの MouseLeave イベントハンドラが起動し、ピクチャボックスが表示されなくなります
  2. ピクチャーボックスが表示されていないため、マウスはピクチャーボックスから出てユーザーコントロールに入ります。
    • あなたの MouseEnter イベントハンドラが起動し、ピクチャボックスが表示されます。
  3. 画像ボックスが表示されるようになったので、プロセスは最初からやり直します。

コードをテストしたところ、「ボタン」が継続的に点滅し(表示が切り替わり続けたため)、クリックを記録できるほど長く表示し続けることができませんでした。

これに対処する 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, 、対応するイベントをサブスクライブする代わりに、ユーザーコントロール内のメソッドを使用します。
  • この方法でコントロールを処理すると、キーボードのみでアプリケーションを使用できなくなる可能性があることに注意してください。(すなわち、ユーザーはできません タブ ボタンに合わせて押してください 入力)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top