【问题标题】:Panel loses focus and scrollbar cannot be scrolled面板失去焦点,滚动条无法滚动
【发布时间】:2016-10-30 22:09:25
【问题描述】:

我有一个包含 10 个子面板的主面板。当我的光标进入父面板时,我希望滚动条可以从鼠标滚动中滚动。

我通过在鼠标进入时添加 ParentPanel.Focus() 来做到这一点。一切正常,直到当我的光标离开文本框所在的子面板时,我看到该子面板中的文本框无法使用(我无法输入它们)。为了解决这个错误,我评论了 ParentPanel.Focus() 并且文本框工作正常。但同样,我无法滚动。有解决办法吗?

【问题讨论】:

  • 对 TextBox 的 Enter 事件进行编码:textbox1.Focus(); ?
  • 然后为 20 个 TextBox 这样做?是不是太多了?
  • 好吧,如果可行,您可以将它们全部动态和递归地连接到同一个事件,并将发送者投射到 TextBox.. - 但也许捕获 scrllUp&Down 消息是另一种选择..?

标签: c# winforms events focus panel


【解决方案1】:

Panels 并不擅长拥有Focus

这个小助手函数会捕获所有TextBoxesPageUpPageDown 键,并让它们滚动外部Panel

void hookUpTextBoxesIn(Control ctl, ScrollableControl sCtl)
{
    foreach( Control c in ctl.Controls)
    {
        if (c.Controls.Count > 0) hookUpTextBoxesIn(c, sCtl);
        if (c is TextBox)
        {
            c.PreviewKeyDown += (s, e) =>
                {
                    if (e.KeyData == Keys.PageDown) sCtl.AutoScrollPosition =
                        new Point(sCtl.AutoScrollPosition.X, 
                                 -sCtl.AutoScrollPosition.Y + 10);
                    if (e.KeyData == Keys.PageUp) sCtl.AutoScrollPosition =
                        new Point(sCtl.AutoScrollPosition.X,
                                 -sCtl.AutoScrollPosition.Y - 10);
                };
        }
    }
}

您可以像这样在设置中调用它一次:

hookUpTextBoxesIn(ParentPanel, ParentPanel);

MouseEnter 你可以写:

  if (!(ActiveControl is TextBox)) textBox1.Focus();

如果您愿意,可以更改滚动量。我仅针对垂直滚动对其进行了编码和测试。您可能希望将其扩展为其他键或高级组合键..

【讨论】:

  • 父面板的MouseEnter?
  • 是的,我就是这个意思。但这实际上取决于您的布局的细节:如果子面板填充了父面板,而您永远无法“拒绝”它。那么所有子面板的 MouseEnter 都必须使用。它们也可以连接到同一个事件。
猜你喜欢
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2018-12-29
  • 2010-11-22
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多