可能重复:
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
,我希望用户能够将数据填入。
当用户点击文本框并将鼠标移到面板上时,就会遇到挑战 - 这会使控件远离文本框并阻止用户输入。
我怎样才能最好地处理这种情况?
答案 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
上的事件。让Panel
对MouseWheel
事件做出反应的另一种方法是在您的表单上订阅Textbox
的相应事件,甚至订阅您的所有控件的事件形式。
然后在你的处理程序中,检查鼠标是否在Panel
的范围内。如果是,请指示面板滚动。如有必要,请不要忘记传播鼠标事件。
修改强>
其他信息:
希望这有帮助。