面板失去焦点,滚动条无法滚动

本文关键字:滚动 滚动条 失去 焦点 | 更新日期: 2023-09-27 17:52:55

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

我通过在鼠标进入时添加ParentPanel.Focus()来实现这一点。一切都工作得很好,直到我看到当我的光标离开文本框所在的子面板时,这个子面板中的文本框无法使用(我无法在其中键入)。为了解决这个错误,我注释了ParentPanel.Focus(),文本框工作得很好。但是我还是不能滚动。有解决这个问题的方法吗?

面板失去焦点,滚动条无法滚动

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();

如果你喜欢,可以改变滚动量。我编码和测试它的垂直滚动只。您可能希望将其扩展为其他键或高级键组合。