C#自动滚动面板 - 控件聚焦时滚动条位置重置

18

这是针对Windows表单的。

面板拥有AutoScroll = True属性。

我正在将面板动态添加到主面板上,但由于超出了主面板显示矩形,必须进行添加。然后在添加的面板上添加标签、组合框和文本框。

如果我选择组合框或文本框,则会将主面板滚动条位置重置为0,同时组合框的下拉菜单会放置在屏幕X,Y上,而不是应该在滚动条未重置时的位置。

我正在考虑在选择控件时保存滚动位置。经过测试,似乎尚未重置滚动位置,因此我可以在此处捕获它。然后希望在面板的某个事件上恢复滚动位置。我正试图找出使用哪个事件来恢复滚动位置。 我也希望这样做时下拉菜单能够放置在正确的x,y位置。

更好的解决方案是基于面板控件创建自定义控件,并重写一个事件?这样,每次使用滚动面板时就不需要保存滚动位置,以免项目混乱。


看起来,如果我选择控件一次,它会跳到顶部,然后如果我再次选择同一个控件并向下滚动,滚动条位置将不会被重置。 - Untouchable
2个回答

35

我在这里找到了解决我的问题的答案: 答案

public class CustomPanel : System.Windows.Forms.Panel
{
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
    {
        // Returning the current location prevents the panel from
        // scrolling to the active control when the panel loses and regains focus
        return this.DisplayRectangle.Location;
    }
}

5
为了后代(如果链接失效):1. 子类面板 2. 重写ScrollToControl()方法,使其返回this.DisplayRectangle.Location - Asaf
对于胆小的人来说:“子类化”不超过以下几步:将上述代码粘贴到您的_Form.cs_中,并在_Form.Designer.cs_中的两个位置更改..System.PanelCustomPanel - TaW
当使用TabPage而不是Panel时,过程完全相同,但您必须从TabControl的边框中减去3个像素,以获取DisplayRectangle.Location的X和Y值。 - Alexander Pacha

2
谢谢,这个很好用,除了我需要调整底部面板的填充。对于其他可能会看到一些偏移量的人来说,这仅作为提示。
protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
{
    Point retPt = DisplayRectangle.Location;
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom));

    return retPt;
}

这个解决方案对我来说比其他方案更好,因为它考虑了填充。另一个解决方案会导致我的点击引起非常轻微的向上滚动。 - mandy1339

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接