如何在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);
它按预期工作。
希望它能帮助任何遇到与我完全相同的问题的人。
我正在创建一个可以在其内部显示项目的自定义控件,因此如果有项目在屏幕外,我希望用户能够滚动浏览它们。
但我似乎无法在标准 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);
它按预期工作。
希望它能帮助任何遇到与我完全相同的问题的人。