0

重複の可能性:
パネルにフォーカスがない

少し厄介な状況です。PictureBox内に保持されたWinFormがありますPanel(フォームの特定のサイズ制限を超えた場合に画像をスクロール可能にすることができます)。

ここで、ユーザーがMouseWheelを使用してパネルをスクロールできるようにするために、次のコードを入力する必要がありました。

Private Sub MyPanel_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyPanel.MouseEnter
    MyPanel.Focus()
End Sub

これはうまく機能し、ユーザーが好きなように画像をスクロールできるようにします。

さて、私の問題はtextbox、ユーザーがデータを入力できるようにするフォームにもあるということです。ユーザーがテキストボックスをクリックしてマウスをパネル上に移動すると、問題が発生します。これにより、テキストボックスから制御が失われ、ユーザーが入力できなくなります。

どうすればこの状況に最もよく対処できますか?

4

2 に答える 2

0

焦点を盗む?

フォーカスを盗むことが本当に問題を解決する正しい方法であるかどうかを検討してください。フォーカス/非フォーカスの違いが非常に明白であり、それはとても簡単に見えるので、それは非常に魅力的です。しかし、それはすぐに混乱に変わる可能性があります。

想定外のときにフォーカスを盗むサードパーティのコンポーネントを使用していると想像してみてください。イライラして、フォーカスを取り戻すためのコードを書くでしょう。問題は解決しましたか?しかし、今では1つではなく、2つのコンポーネントが不適切にフォーカスを奪っています。そして最終的に、ユーザーはこのフォーカス戦争の犠牲者になります。

TextBox代わりにイベントを購読する

現在、でイベントをリッスンしていますPanelPanelをイベントに反応させる別の方法MouseWheelは、代わりにフォーム上のの適切なイベントをTextboxサブスクライブするか、フォーム上のすべてのコントロールのイベントをサブスクライブすることです。

次に、ハンドラーで、マウスがの範囲内にあるかどうかを確認しますPanel。その場合は、パネルにスクロールするように指示します。必要に応じて、マウスイベントを伝播することを忘れないでください。

編集

追加情報:

お役に立てれば。

于 2012-11-13T21:16:31.470 に答える
0

このフォームは本番用なので、なんらかの解決策を考え出す必要があったので、次のようにコーディングしました(これで問題は解決しました)が、もっと良い解決策があればぜひ聞いてみてください!!!

' Form-Level Variable stating whether the panel can take
' the focus away from the preceding control

Dim DontTakeAwayFocus As Boolean = False

Private Sub MyPanel_Click(sender As Object, e As EventArgs) Handles MyPanel.Click
  MyPanel.Focus()
End Sub

Private Sub MyPanel_MouseEnter(sender As Object, e As EventArgs) Handles MyPanel.MouseEnter
  If DontTakeAwayFocus Then Exit Sub
  MyPanel.Focus()
End Sub

Private Sub MyTxtBox_GotFocus(sender As Object, e As EventArgs) Handles MyTxtBox.GotFocus
  DontTakeAwayFocus = True
End Sub

Private Sub MyTxtBox_LostFocus(sender As Object, e As EventArgs) Handles MyTxtBox.LostFocus
  DontTakeAwayFocus = False
End Sub

これにより、テキストボックスにフォーカスがある場合は、パネルをクリックしてフォーカスを外す必要がありました。それ以外の場合、パネルは同じ機能を維持していました。

于 2012-11-13T21:08:52.257 に答える