Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Net面板创建包含在单个块中的表单_Vb.net_User Interface - Fatal编程技术网

Vb.net Net面板创建包含在单个块中的表单

Vb.net Net面板创建包含在单个块中的表单,vb.net,user-interface,Vb.net,User Interface,我目前正在尝试创建一个窗口应用程序,其中窗口的内容可以更改(控件的内容以及控件本身)。我使用表单模板化了每个特定的控件布局,然后为主窗口创建了一个只包含一个面板的表单。我在这个面板中加载表单。当布局更改时,我清除面板,然后将新的布局表单加载到面板中 然而,如果我这样做的话,在加载新表单的一瞬间,表单的标题窗口似乎出现在面板中,控件也会短暂闪烁,好像它们是一个接一个地创建的,而不是一次全部出现 我已经尝试了隐藏/取消隐藏表单以及加载表单的面板的各种组合。我还尝试在添加表单之前调用SuspendLa

我目前正在尝试创建一个窗口应用程序,其中窗口的内容可以更改(控件的内容以及控件本身)。我使用表单模板化了每个特定的控件布局,然后为主窗口创建了一个只包含一个面板的表单。我在这个面板中加载表单。当布局更改时,我清除面板,然后将新的布局表单加载到面板中

然而,如果我这样做的话,在加载新表单的一瞬间,表单的标题窗口似乎出现在面板中,控件也会短暂闪烁,好像它们是一个接一个地创建的,而不是一次全部出现

我已经尝试了隐藏/取消隐藏表单以及加载表单的面板的各种组合。我还尝试在添加表单之前调用
SuspendLayout()
,然后在面板上调用
resumeloayout()
来阻止表单提前显示

有没有办法让表格一次全部画出来,而不是一块一块地画出来

编辑

我终于得到了带代码的pendrive(这是我正在帮助其他人的项目)

以下是代码的相关部分:

Public Class MainWindow

    Dim currentPanel As Control

    ...

     Private Sub MainWindow_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Me.Location = New Point(0, 0)
        Me.Size = SystemInformation.PrimaryMonitorSize

        mainpanel.Size = SystemInformation.PrimaryMonitorSize

    End Sub

    ...

    Sub nextTrial()
        TrialSet.currentTrial = TrialSet.currentTrial + 1
        If TrialSet.currentTrial < TrialSet.numTrials Then
            Dim TrialFrm As Trial
            TrialFrm = New Trial(TrialSet.getTrial(TrialSet.currentTrial))
            TrialFrm.TopLevel = False
            setForm(TrialFrm)
        Else
            Dim doneFrm As DoneForm
            doneFrm = New DoneForm
            doneFrm.Toplevel = False
            setForm(doneFrm)
        End If
    End Sub

    ...

    Private Sub setForm(ByVal ctrl As Control)
        mainpanel.Hide()
        mainpanel.SuspendLayout()
        mainpanel.Controls.Clear()
        If Not (currentPanel Is Nothing) Then
            currentPanel.Dispose()
        End If
        currentPanel = ctrl
        mainpanel.Controls.Add(ctrl)
        ctrl.Hide()
        mainpanel.Show()
        mainpanel.ResumeLayout()
        ctrl.Show()
    End Sub

End Class

有了这个,我可以看到表单的窗口边框,包括关闭按钮等,出现了一小段时间。

对此有多种解释,不显示代码不会给我们任何提示。最简单的方法是使问题可调试。将此代码复制/粘贴到放置在面板中的表单类中:

Protected Overrides Sub OnHandleCreated(e As EventArgs)
    MyBase.OnHandleCreated(e)
End Sub

Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
    MyBase.OnFormClosed(e)
End Sub
在两个方法上都设置断点。期望看到OnHandleCreated()执行多次。调试器的“调用堆栈”窗口显示是什么代码导致了这种情况。到目前为止,最简单的解释是,在将FormBorderStyle设置为None之前,先将Visible属性设置为True,然后再将其设置为soon(或称为Show)。交换语句以修复。还有一些,让调试器告诉您为什么会发生这种情况


另一个期望是在OnFormClosed()方法上没有断点。这是非常非常糟糕的,会导致您的程序逐渐变慢,最终导致“错误创建窗口句柄”异常崩溃。这是由代码中的错误导致的,该错误再次删除表单,使用面板的Controls.Clear()或Remove/At()方法,而不是调用表单的Dispose()方法。调用Dispose()是一个非常困难的要求。

这听起来可能是一个愚蠢的问题,但是计算机是否足够快,可以运行表单?您可能只是有太多的对象,它无法正确绘制。另外,请检查您的程序的发行版和调试版之间是否有任何差异,对我来说,调试版通常运行较慢。计算机相当不错(2GHz的四核,8G的Ram),因此速度应该没有问题。我还测试了调试版本和发布版本,同样的问题。表单上没有很多控件,一张图片,一个3*5的表格布局和一些子控件。我看到窗口边框(面板内的窗体)和控件一个接一个地出现。你试过隐藏表单直到加载吗?@cybermonkey:我终于发布了上面的代码。我正在隐藏表单,但我不确定它是否“在加载之前”被隐藏。有没有办法确保它在完全加载之前不显示?我目前没有可用的代码,因此无法在此处提供。我将尝试您的解决方案,并尽快发布部分代码。@LiKao如果您回答我的问题,我将不胜感激。
Protected Overrides Sub OnHandleCreated(e As EventArgs)
    MyBase.OnHandleCreated(e)
End Sub

Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
    MyBase.OnFormClosed(e)
End Sub