【问题标题】:VB.NET Unexpected Anchoring behavior on controls created at runtimeVB.NET 在运行时创建的控件上的意外锚定行为
【发布时间】:2018-08-20 18:50:57
【问题描述】:

概述:创建一个小应用程序来协助查看 SCCM 的日志文件。

我刚开始开发一个小应用程序来分析日志文件。主窗体有一个名为“tcMain”的空 TabControl。它还有一个按钮(用于测试目的),它将创建一个新的“LogAssembly”类。此类包含 TabPage 和其他嵌套控件的 UI 元素。

LogAssembly 类的内部是一个 RichTextBox。它以文本框随表单大小增长的方式锚定。

问题:创建的第一个“LogAssembly”按预期工作。 tcMain 已填充,一切看起来都很好。富文本框按预期调整大小。

任何后续的 LogAssembly 都有问题。富文本框很大,看起来超出了它所嵌套的控件。

我怀疑这个问题与我创建/操作控件的顺序有关。但是,我并没有牢牢掌握运行时的控制管理。我希望有人能指出我在这里做错了什么。

下面是相关代码:

Form1:(按 btnOptions 在 tcMain 上创建新的“LogAssembly”)

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Text = "SCCM Log Analyzer (v" & APP_VERSION & ")"
    End Sub


    Private Sub btnOptions_Click(sender As Object, e As EventArgs) Handles btnOptions.Click
        Dim TestA As New LogAssembly(tcMain, "Example_")
    End Sub

End Class

LogAssembly 类:

Public Class LogAssembly
Public UI_ParentTab As TabPage = New TabPage

'Main UI Elements
Public UI_GroupBoxA As GroupBox = New GroupBox
Public UI_ChildTabControl As TabControl = New TabControl
Public UI_PageEvents As TabPage = New TabPage
Public UI_PageText As TabPage = New TabPage
Public UI_PageItem As TabPage = New TabPage

'Event View Elements
Public UI_EventsText As RichTextBox = New RichTextBox
Public UI_EventsResearch As Button = New Button


Public Sub New(ByRef parent As TabControl, ByVal data As String)
    UI_ParentTab.Text = data
    parent.TabPages.Add(UI_ParentTab)

    'Group Box UI
    UI_GroupBoxA.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    UI_ParentTab.Controls.Add(UI_GroupBoxA)
    UI_GroupBoxA.Location = New System.Drawing.Point(5, 5)
    UI_GroupBoxA.Size = New Point(912, 405)
    UI_GroupBoxA.Text = "Selected Log"

    'Tab Control UI
    UI_GroupBoxA.Controls.Add(UI_ChildTabControl)
    UI_ChildTabControl.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    UI_ChildTabControl.Location = New System.Drawing.Point(5, 15)
    UI_ChildTabControl.Size = New Point(900, 385)

    'Tab Page Events
    UI_ChildTabControl.TabPages.Add(UI_PageEvents)
    UI_PageEvents.Text = "Event View"
    UI_PageEvents.Controls.Add(UI_EventsText)
    UI_PageEvents.Controls.Add(UI_EventsResearch)
    '_TextBox
    UI_EventsText.Text = data
    UI_EventsText.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    UI_EventsText.Location = New System.Drawing.Point(5, 30)
    UI_EventsText.Size = New Point(490, 140)
    '_Button
    UI_EventsResearch.Location = New Point(5, 5)
    UI_EventsResearch.Text = "Things"


    'Tab Page Text
    UI_ChildTabControl.TabPages.Add(UI_PageText)
    UI_PageText.Text = "Text View"


    'Tab Page Item
    UI_ChildTabControl.TabPages.Add(UI_PageItem)
    UI_PageItem.Text = "Item View"

End Sub
End Class

【问题讨论】:

  • 打破按钮按下并逐步完成该过程似乎可以解决锚定问题。我在类文件中扔了很多 Application.DoEvents() 以便我可以看到哪个部分导致了绘图问题。但是,它并没有透露任何有用的信息。我删除了断点并留下了“DoEvents()”。问题返回。也许这是线程或时间问题?
  • 绘图问题?我以为这是控件大小问题?
  • 为什么要将Point 分配给Size 属性? 启用Option Strict.
  • 在调试中单步执行时我能想到的唯一区别是我可以在标签页被绘制后立即单击它。然后继续单步执行,观察剩余的控件被绘制出来。
  • 我称之为绘图问题。据我所知,这仍然是一个锚定问题。因为如果我删除锚定属性线。它会画得很好。至于点和大小。我复制了我在设计器代码中看到的完成方式。

标签: .net vb.net winforms


【解决方案1】:

这与锚点和您将子控件添加到容器的顺序有关。如果你看看设计师是如何工作的,就会有一个命令:

Container0,1,2,... 示例中的 Container0 是父级:

将 Container2 添加到 Container1
初始化 Container1
将 Container3 添加到 Container2
初始化 Container2
将 Container4 添加到 Container3
初始化 Container3
...
...
最后将Container1添加到Container0

您还需要以相同的顺序暂停布局,所以:

UI_ParentTab.SuspendLayout() 'Container1
UI_GroupBoxA.SuspendLayout() 'Container2
UI_ChildTabControl.SuspendLayout() 'Container3
UI_PageEvents.SuspendLayout() 'Container4
parent.SuspendLayout() 'Container0

'UI_ParentTab
UI_ParentTab.Controls.Add(UI_GroupBoxA)
UI_ParentTab.Text = data

'Group Box UI
UI_GroupBoxA.Controls.Add(UI_ChildTabControl)
UI_GroupBoxA.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top _
    Or System.Windows.Forms.AnchorStyles.Bottom) _
    Or System.Windows.Forms.AnchorStyles.Left) _
    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
UI_GroupBoxA.Location = New System.Drawing.Point(5, 5)
UI_GroupBoxA.Size = New Size(912, 405)
UI_GroupBoxA.Text = "Selected Log"

'UI_ChildTabControl
UI_ChildTabControl.TabPages.Add(UI_PageEvents)
UI_ChildTabControl.TabPages.Add(UI_PageText)
UI_ChildTabControl.TabPages.Add(UI_PageItem)
UI_ChildTabControl.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top _
    Or System.Windows.Forms.AnchorStyles.Bottom) _
    Or System.Windows.Forms.AnchorStyles.Left) _
    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
UI_ChildTabControl.Location = New System.Drawing.Point(5, 15)
UI_ChildTabControl.Size = New Size(900, 385)

'Tab Page Events
UI_PageEvents.Controls.Add(UI_EventsText)
UI_PageEvents.Controls.Add(UI_EventsResearch)
UI_PageEvents.Text = "Event View"
'_TextBox
UI_EventsText.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top _
    Or System.Windows.Forms.AnchorStyles.Bottom) _
    Or System.Windows.Forms.AnchorStyles.Left) _
    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
UI_EventsText.Text = data
UI_EventsText.Location = New System.Drawing.Point(5, 30)
UI_EventsText.Size = New Size(490, 140)
'_Button
UI_EventsResearch.Location = New Point(5, 5)
UI_EventsResearch.Text = "Things"

'Tab Page Text
UI_PageText.Text = "Text View"

'Tab Page Item
UI_PageItem.Text = "Item View"

parent.TabPages.Add(UI_ParentTab)

UI_ParentTab.ResumeLayout(False)
UI_GroupBoxA.ResumeLayout(False)
UI_ChildTabControl.ResumeLayout(False)
UI_PageEvents.ResumeLayout(False)
parent.ResumeLayout(False)

【讨论】:

  • 非常感谢。我很感激有时间帮助我解决这个问题。正如其他人提到的那样,我的实施可能不会赢得任何奖项。但从根本上说,它应该有效,而且你帮助我克服了那个特殊的障碍。我将练习 SuspendLayout 并将其添加到我的技巧包中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多