【问题标题】:Keeping focus on textbox while another control grabs focus on mousemove [duplicate]将焦点放在文本框上,而另一个控件将焦点放在 mousemove [重复]
【发布时间】:2012-11-02 07:47:32
【问题描述】:

可能重复:
Panel not getting focus

我有一个有点烦人的情况。 我有一个 WinForm,PictureBox 包含在 Panel 中(因此,如果图片超出了我的表单具有的特定大小限制,我可以使图片可滚动)。

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

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

这很好用,允许用户随意滚动图片。

现在,我的问题是我的表单上还有一个textbox,我希望用户能够向其中填写数据。 当用户单击文本框并将鼠标移到面板上时,挑战就出现了——这会导致文本框失去控制并阻止用户输入。

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

【问题讨论】:

  • 我很抱歉这被视为一个重复的问题 - 事实是我什至没有看到相似之处 - 这可能与我的编程能力有关 :)

标签: c# .net vb.net


【解决方案1】:

由于我必须想出某种解决方案,因为此表单将用于生产,因此我编写了以下代码(解决了问题),但如果有人有更好的解决方案,我很想听听他们!!!

' 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

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

【讨论】:

    【解决方案2】:

    窃取焦点?

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

    想象一下,您使用的第三方组件有时会在不应该的情况下窃取焦点。恼火的是,您会编写一些代码来重新获得焦点。问题解决了,不是吗?但现在有两个组件不恰当地窃取了焦点,而不是一个。而最终,用户将成为这场焦点战的牺牲品。

    改为订阅TextBox 事件

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

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

    编辑

    附加信息:

    希望这会有所帮助。

    【讨论】:

    • Arjen,我很抱歉-您的解决方案听起来更聪明,但我真的不知道该怎么做您所描述的-您能否发布一些简单的代码/提供您的意思的链接订阅这种情况的事件?谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多