如何在winforms中为自定义控件添加滚动

How to add scrolling to custom control in winforms

我正在创建一个可以在其内部显示项目的自定义控件,因此如果有项目在屏幕外,我希望用户能够滚动浏览它们。

但我似乎无法在标准 Control class 中的 UseStyle() 中找到任何属性或标志。 那么如何为控件创建滚动条呢?

我知道我可以创建 VScrollBar class 的单独实例,并将其绘制为单独的控件,但在我看来这样做效率低下或错误,我将不胜感激有关如何解决此问题的方法。谢谢

如果我理解你的问题,这就是我获得滚动行为的方法:

如果将一个包含 3 个子控件的简单面板控件设置为主窗体的 Dock.Fill,并将 AutoScroll 属性 设置为 true,当主 window 已调整到内容不再适合的位置。

如 Hans 的评论所述,如果用户控件继承是 CustomUserControl : Panel 那么它将表现出这种行为。

正如评论所建议的那样,我从 ScrollableControl 派生了我的 class 并使用 AutoScroll 属性 将滚动逻辑纳入我的控制。

遗憾的是,关于 ScrollableControl.AutoScrollMinSize 的 Microsoft 文档缺乏关于 属性 实际含义的详细信息。既不是来自名称也不是来自描述。

它说:

A Size that determines the minimum size of the virtual area through which the user can scroll.

有一段时间我无法弄清楚这到底是什么意思,后来我想出了更好的描述:用户可以滚动的内容槽的大小.

它也没有说要使滚动条出现,这个最小尺寸应该比控件本身大。所以,我终于可以实现我需要的东西了:

这是设置 AutoScrollMinSize

的代码
this.AutoScrollMinSize = new Size(0, _displayedItems.Count * (this.ItemHeight + this.ItemsMargin));
this.VerticalScroll.LargeChange = this.ItemHeight;
this.VerticalScroll.SmallChange = this.ItemHeight / 3;

对于 X 组件我有 0,因为我不需要水平滚动。 对于 Y 组件,我计算了用户可以与之交互的整个内容的大小。

对于内容的实际滚动,我只是翻译滚动值的图形:

e.Graphics.TranslateTransform(0, this.AutoScrollPosition.Y);

它按预期工作。

希望它能帮助任何遇到与我完全相同的问题的人。