将控件滚动到FlowLayoutPanel的可见顶部

3
我已经实现了一个流式布局面板来展示图片,类似于灯箱效果。 我需要将新的图片添加到 FLP 中,不是在末尾,而是作为前导图片。 为此,我创建了一个包含新图片的列表,并在此列表中添加了 FLP 中的图片,然后清除了 FLP 的控件,并添加了临时列表中的所有图片。这一切都很好,只是我想保持第一张图片的滚动位置。 我想知道如何将控件滚动到面板的顶部。 使用 ScrollControlIntoView,图片变得可见,但它没有滚动到面板的顶部。
请查看下面的两张图片,以更清楚地描述要求:

第一张图片显示在添加新行之前的情况。然后,在标记图片(红色箭头)上方添加新图片后,第二张图片显示黄色新行应向上滚动。

我希望将黄色标记的行滚动出窗口,以使标记的图像保持在其位置。
2个回答

6
FlowLayoutPanel.AutoScrollPosition非常重要,它确定了面板被滚动的距离以及其控件的Location属性被调整的量以实现滚动。
因此,首先要做的是获取控件的Location属性,并通过减去AutoScrollPosition来调整它,以恢复其原始设计位置。然后你可能想减去控件的Margin。然后你就知道了将其滚动到顶部所需的新的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;
    }

2
改变位置,请尝试以下代码:

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

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


谢谢Marc,但这是一个误解。我没有清楚地解释需求。我不想将单个控件移到顶部,而是想通过滚动将新添加的项目移到控件上方。我会提供两张图片。 - Alex Ramisch
好的,我明白了。你能否分享一下代码,这样我就可以在我的电脑上重现这个问题吗? - Marc

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