保持对文本框的关注,而另一个控件抓住重点放在mousemove上

时间:2012-11-13 20:29:03

标签: c# .net vb.net

  

可能重复:
  Panel not getting focus

我有点烦人的情况。 我有一个PictureBox的{​​{1}}的WinForm(如果它超出我的表单所具有的特定大小限制,我可以将图片滚动)。

现在,为了使用户能够使用MouseWheel在面板中滚动,我必须输入以下代码:

Panel

这很好用,允许用户按照我的意愿滚动​​图片。

现在,我的问题是我的表单上还有Private Sub MyPanel_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyPanel.MouseEnter MyPanel.Focus() End Sub ,我希望用户能够将数据填入。 当用户点击文本框并将鼠标移到面板上时,就会遇到挑战 - 这会使控件远离文本框并阻止用户输入。

我怎样才能最好地处理这种情况?

2 个答案:

答案 0 :(得分: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

这让我能做的是,如果文本框有焦点,那么你必须单击面板才能将焦点移开,否则,面板仍保持相同的功能。

答案 1 :(得分:0)

窃取焦点?

考虑窃取焦点是否真的是解决问题的正确方法。它非常诱人,因为焦距/非焦点差异是如此明显,而且看起来很容易。但它很快就会变成一团糟。

想象一下,你正在使用第三方组件,有时会在不应该的时候窃取焦点。懊恼,你会写一些代码来抓住焦点。问题解决了,不是吗?但现在不是一个,而是有两个组件不恰当地窃取焦点。最终,用户将成为这场焦点战的牺牲品。

订阅TextBox活动

现在你正在监听Panel上的事件。让PanelMouseWheel事件做出反应的另一种方法是在您的表单上订阅Textbox的相应事件,甚至订阅您的所有控件的事件形式。

然后在你的处理程序中,检查鼠标是否在Panel的范围内。如果是,请指示面板滚动。如有必要,请不要忘记传播鼠标事件。

修改

其他信息:

希望这有帮助。