我已经实现了一个flowlayoutpanel来将图像显示为一种灯箱。 我需要将新图像添加到FLP中而不是最后,而是作为前导图像。 为此,我创建了一个包含新图像的List,在此列表中,我在添加操作之前添加了FLP的图像。然后我清除了FLP的控件并添加了临时列表中的所有图像。这一切都很好,除了我想保留第一张图像的滚动位置。 我想知道,如何将控件滚动到面板的顶部。 使用ScrollControlIntoView,图像变为可见,但不会滚动到面板顶部。
请查看接下来的2张图片,以更清楚地描述要求:
first image显示上面添加新行之前的情况。 然后在标记图像(红色箭头)上方添加新图像后 2nd image显示黄色新行应该向上滚动。
我想将黄色标记的行滚出窗口,以便标记的图像保持在其位置
答案 0 :(得分:3)
FlowLayoutPanel.AutoScrollPosition对于实现这一目标至关重要。它通过调整控件的Location属性以实现滚动来确定面板滚动和的距离。
首先,您要做的是获取控件的Location属性,并通过减去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;
}
答案 1 :(得分:1)
要更改位置,请尝试以下代码:
int currentPosition = FLP.Controls.GetChildIndex(controlToMove);
FLP.Controls.SetChildIndex(controlToMove, currentPosition - 1);
或者只需调用您想要移动到顶部的控件的BrintToFront()
方法。