将控件滚动到流布局面板的可见顶部
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;
}
我已经实现了一个 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;
}