将控件滚动到Flowlayoutpanel

时间:2016-12-10 21:20:03

标签: c# flowlayoutpanel

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

请查看接下来的2张图片,以更清楚地描述要求:

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

我想将黄色标记的行滚出窗口,以便标记的图像保持在其位置

2 个答案:

答案 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()方法。