【问题标题】:Making a User Control that is in two pieces制作一个分为两部分的用户控件
【发布时间】:2019-05-10 04:59:55
【问题描述】:

我正在创建一个可折叠的面板控件,它由一个停靠在顶部的可点击标签组成,内部带有一个向上/向下箭头,下面的一个面板被设置为填充控件的其余部分,无论大小。

我还添加了使控件在设计时可编辑的代码。

<Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design", GetType(IDesigner))> _

我计划拥有这个控件的多个“版本”,它们的行为会有所不同。例如;

  • 仅填充动态创建的复选框,这些复选框将保留已检查内容的运行列表。

  • 另一个包含手动或动态添加的单选按钮。

  • 另一个是人工设计的等等

因此,这些版本中的每一个都将是一个包含原始控件的新控件。

但是我遇到了一个问题。当我将控件添加到此用户控件(如 tablelayoutplanel)并将它们设置为 Dock.Fill 时。在设计时它们看起来很好,添加的控件位于标签下方,但是一旦应用程序运行控件内部填充以覆盖标签,并且当执行停止时,更改也会反映在设计版本中。

所以我想弄清楚是否可以制作一个由多个单独的“部分”组成的用户控件;

  • 设计者无法访问的标签。

  • 下面的容器面板将...包含所有内容并在设计时可访问。

除非我知道我的标签有多高,否则是否有办法覆盖 Dock.Fill 使其顶部位置从 X 开始?我宁愿避免编写调整所有东西大小的代码,因为我无法知道将来有多少东西可能会或可能不会以手工制作的方式结束。

我已尝试查找可折叠面板的示例,但到目前为止,当我从内置的旧版本 VS 或使用 C# 迁移它们时,我发现所有这些都导致设计器和代码错误。

另外,它们并没有我想要达到的外观。这是

如果其中任何一个都无法完成,请告诉我,这样我就可以尝试找出一种不同的方法来实现我想要达到的目标,这基本上相当于;一个从标签大小开始并打开/关闭显示 dock.fill 容器的东西,该容器在打开时内部有控件并且不会跨过标签。

谢谢。

编辑:Added a quick video to show the behavior.

【问题讨论】:

  • 尝试将面板添加到 UC,作为您添加的控件的容器(而不是将新控件直接放在 UC 表面上)。该面板可以固定在所有侧面并位于标签的正下方。另外,请阅读此处的注释:auto-resize multiple windows forms being rendered on panel 关于对接行为 + 一些提示。
  • 感谢您的建议,我会阅读您所链接的内容,尽管正如我在帖子中提到的,标签下方已经有一个面板控件,停靠以填充。但在执行时,它似乎将用户控件视为一个大对象,而不是两个独立的对象。
  • 您可以有一个面板容器停靠(在标签下方)。但是,在这种情况下,标签必须位于停靠到 TOP 的另一个容器(另一个面板)内。在我链接的注释中,请参阅停靠控件时的布局机制。标签将被视为 静态 对象而不是 顶级 对象。
  • 我将两个标签都放在一个面板中,将所述面板停靠在顶部,将其发送到后面,因此它具有最低的 Z 设置我的第二个面板要填充,这使得它占据了下面的剩余空间面板 1. 编译。将控件放入新控件中,将其设置为填充,在控件的“第二个面板”内放置一个表格布局面板,将其设置为填充,然后再次在设计中停止在“第二个面板”的边界处,但在调试中它会填充整个控件,一旦退出它也会填充整个控件,直到我更改对接。我将制作一个视频来更好地解释正在发生的事情。
  • 在原始帖子中添加了视频,虽然行为发生了一些变化,但现在它在我所描述的内容之间交替,或者只是将控件推到应该包含它们的对象后面。跨度>

标签: vb.net user-controls


【解决方案1】:

所以我有点能够达到我想要的效果,但我不得不走一条完全不同的路线,这让我不太高兴。

我现在有两个控件作为我的滑动面板控件的一部分。

  • SlidePanelLabel

  • SlidePanelPanel

SlideLabelLabel 位于它所在的父级的顶部,如果单击它会根据 parent.maximumsize.height 增大和缩小所述父级,而不会实际影响自身。

SlidePanelPanel 只是一个空面板控件,其中包含一些覆盖处理一些令人讨厌的滚动条情况。


一方面,这意味着我可以根据需要使用“标签”来扩大和缩小其他内容,并且我可能会对其进行扩展以赋予它一些方向性功能。

另一方面,我真的很想弄清楚如何制作一个可以“生成”对象的东西,该对象在其周围/内部的区域中具有设计器功能,例如选项卡控件。选项卡区域会阻止您向其中添加控件,但页面不会。

基本上,只要将 SlidePanelLabel 添加到某个东西上,它就会生成一个 SlidePanelPanel,并让生成的 SlidePanelPanel 能够在其上放置控件。

所以除非有人对后者有见解,否则我猜你可以认为这个问题已经结束。

我要感谢 Jimi 提供的帮助以及有关停靠和锚定等方面的有用信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 2015-05-16
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多