将控件滚动到流布局面板的可见顶部

Scroll a control to the visible top of a Flowlayoutpanel

我已经实现了一个 flowlayoutpanel 来将图像显示为一种灯箱。 我需要将新图像添加到 FLP 中,而不是在末尾,而是作为前导图像。 为此,我创建了一个包含新图像的列表,并在添加操作之前将 FLP 的图像添加到该列表中。然后我清除了 FLP 的控件并添加了临时列表中的所有图像。这一切都很好,除了我想保留第一张图片的滚动位置。 我想知道如何将控件滚动到面板顶部。 使用 ScrollControlIntoView 图像变得可见,但它不会滚动到面板的顶部。

请找到接下来的 2 张图片来更清楚地描述要求:

first image表示的是上面添加新行之前的情况。 然后在标记图像(红色箭头)上方添加新图像后 2nd image 表明黄色的新行应该向上滚动。

我想将黄色标记的行从 window 中滚动出来,以便标记的图像停留在其位置

要更改位置,请尝试以下代码:

int currentPosition = FLP.Controls.GetChildIndex(controlToMove);
FLP.Controls.SetChildIndex(controlToMove, currentPosition - 1);

或者只需调用要移动到顶部的控件的 BrintToFront() 方法。

FlowLayoutPanel.AutoScrollPosition 是实现这一目标的关键。它决定了面板滚动的距离 通过调整其控件的位置 属性 以实现滚动的程度。

因此,您要做的第一件事是获取控件的位置 属性 并通过减去 AutoScrollPosition 对其进行调整以恢复其原始设计位置。那么您可能想要减去控件的边距。然后你知道新的 AutoScrollPosition 让它到​​达顶部。假设它 可以 滚动到顶部,例如通常不适用于底部的控件,否则您必须验证。

因此:

    private void ScrollPanelTo(int index) {
        var ctl = flowLayoutPanel1.Controls[index];
        var loc = ctl.Location - new Size(flowLayoutPanel1.AutoScrollPosition);
        loc -= new Size(ctl.Margin.Left, ctl.Margin.Top);
        flowLayoutPanel1.AutoScrollPosition = loc;
        ctl.Focus();
    }

测试:

    int index;

    private void button9_Click(object sender, EventArgs e) {
        ScrollPanelTo(index);
        index = (index + 1) % flowLayoutPanel1.Controls.Count;
    }