【问题标题】:Programatically positioning a control in a VB.net user control以编程方式在 VB.net 用户控件中定位控件
【发布时间】:2021-03-20 05:17:24
【问题描述】:

我在 VB.Net VS2019 中有一个用户控件。它用于显示描述、值和单位。如果描述不是太大,它通常可以工作。 用户控件中的控件都是标签。

在调整大小事件中,它将描述宽度调整为总宽度的 66%、值的 22%,以及剩余的任何单位。
然后它将描述的左边设置为0,将值的左边设置为描述的宽度(加一点)。对于单位的位置,它将值的左侧位置加上它的宽度和一点。 但是当程序运行时,控件相互重叠,不会占用UserControl的整个空间。

例如,UserControl 的宽度为 236,但看起来所有内容都被压缩到大约 1/2 或 2/3 秒。 我已将 Anchor 设置为 none 并停靠为 none。

我在“调整大小”事件中执行这些计算,如下所示。该代码是从旧的 VB6 程序移植而来的。

“自动”尺寸属性是否优先于我指定的宽度?

    Private Sub UserControl1_Resize(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Resize
    Dim lblUnits_Size As Integer
    Label1.Height = MyBase.Height
    Label2.Height = MyBase.Height
    lblUnits.Height = MyBase.Height

    Label1.Width = CInt(MyBase.Width * 0.6167)
    Label2.Width = CInt(MyBase.Width * 0.22)  
    ' I want the width of the units to be whatever is left over 
    lblUnits_Size = MyBase.Width - (Label1.Width + Label2.Width) - 6
    If lblUnits_Size <= 0 Then lblUnits_Size = 1
    lblUnits.Width = lblUnits_Size  ' was -> TwipsToPixelsX(lbUnits_Size)

    Label1.Left = 0
    Label2.Left = (Label1.Left + Label1.Width) + 3
    lblUnits.Left = (Label2.Left + Label2.Width) + 3

End Sub

【问题讨论】:

  • (假设 WinForms,标记您的问题,指定 UI 平台):使用具有比例列的 TableLayoutPanel,将标签的 AutoSize 属性设置为false,将标签停靠在 TLP 的单元格内。跨度>
  • 我想我认为 VB.Net 已经足够具体了。我不知道有什么不同。这就像学习一种全新的口语。谢谢。 VB.Net 还有多少其他 UI 平台?

标签: vb.net


【解决方案1】:

找到了,需要在描述改变后调用resize代码。我猜 ole VB6 会自动执行此操作,或者以某种方式调用了调整大小。

【讨论】:

  • 您根本不需要任何代码。按照 Jimi 的说法,使用 TableLayoutPanel。这正是它的用途。
  • 我有时需要更改每个项目的分配空间百分比。我发现原来的分配是不够的;所以除非我弄错了,否则我会更改 TLP 中的设置以重做百分比。我没有尝试 TLP。
  • TableLayoutPanel 有一个ColumnStyles 集合,每个ColumnStyle 都有一个Width 属性。你大概有SizeType set tp Percent.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2011-12-15
  • 2011-08-14
相关资源
最近更新 更多