【问题标题】:Scroll a control to the visible top of a Flowlayoutpanel将控件滚动到 Flowlayoutpanel 的可见顶部
【发布时间】:2016-12-10 21:20:03
【问题描述】:

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

请找出以下 2 张图片来更清楚地描述需求:

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

我想将黄色标记的行滚动到窗口外,使标记的图像保持在其位置

【问题讨论】:

    标签: c# flowlayoutpanel


    【解决方案1】:

    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;
        }
    

    【讨论】:

      【解决方案2】:

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

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

      或者直接调用你想移到顶部的控件的BrintToFront()方法。

      【讨论】:

      • 谢谢你,马克,但这是一个误解。我没有清楚地解释这个要求。我不想将单个控件移到顶部,但我想通过使用滚动来将新添加的项目移到控件之上。我将提供 2 张图片。
      • 好的,我明白了。您能否也分享代码,以便我可以重现我这边的问题?
      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      相关资源
      最近更新 更多