Vb.net MDI子窗体从未显示

Vb.net MDI子窗体从未显示,vb.net,mdi,mdichild,mdiparent,Vb.net,Mdi,Mdichild,Mdiparent,我正在制作一个VOS,其中桌面是MDI父窗体。但是,一旦我显示任何子窗口,它们就会出现,加载所有资源,然后再次隐藏。他们也不会回来 显示应用程序的代码: Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click, Label1.Click, TestToolStripMenuItem.Click showapp(Maininternet) End Su

我正在制作一个VOS,其中桌面是MDI父窗体。但是,一旦我显示任何子窗口,它们就会出现,加载所有资源,然后再次隐藏。他们也不会回来

显示应用程序的代码:

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click, Label1.Click, TestToolStripMenuItem.Click
        showapp(Maininternet)
    End Sub

''' <summary>
    ''' Add's an app to the Galaxy OS MDI child tree and shows it.
    ''' </summary>
    ''' <param name="app">Name of the app.</param>
    ''' <remarks></remarks>
    Sub showapp(app As Form)
        AddNewForm(app)
        app.Show()
    End Sub
Private Sub PictureBox1\u Click(发送方作为对象,e作为事件参数)处理PictureBox1。Click,Label1。Click,TestToolStripMenuItem。Click
showapp(主互联网)
端接头
''' 
''将应用程序添加到Galaxy OS MDI子树并显示它。
''' 
''应用程序的名称。
''' 
子showapp(应用程序作为表单)
AddNewForm(应用程序)
app.Show()
端接头
在其中一个模块中:

''' <summary>
    ''' Adds a form to the MDI application
    ''' And links it with a TaskBarItem
    ''' </summary>
    ''' <param name="frm">The form to use</param>
    ''' <remarks></remarks>
    Private Sub AddNewForm(ByVal frm As Form)
        frm.MdiParent = GalaxyOS.Core.GUI.Desktop

        Dim img As Image = CType(New ImageConverter().ConvertFrom(frm.Icon), Image)

        Dim tbItem As New TaskBarItem(frm.Text, img, frm)
        tbItem.ImageScaling = ToolStripItemImageScaling.SizeToFit
        TaskBar.Items.Add(tbItem)

        frm.Show()
    End Sub
“”
''将表单添加到MDI应用程序
''并将其与TaskBarItem链接
''' 
''要使用的表单
''' 
私有子AddNewForm(ByVal frm作为表单)
frm.mdipalent=GalaxyOS.Core.GUI.Desktop
Dim img As Image=CType(新图像转换器().CONVERTFORM(frm.Icon),图像)
尺寸tbItem作为新TaskBarItem(frm.Text、img、frm)
tbItem.ImageScaling=ToolStripItemImageScaling.SizeToFit
任务栏.项目.添加(tbItem)
frm.Show()
端接头
由于它是一个操作系统,因此有一个menustrip充当任务栏,TaskBarItem是一个menustrip项目,显示应用程序的图标、名称以及关闭和恢复应用程序的选项。代码:

Namespace Core.GUI.Desktop.Taskbar
''' <summary>
''' The TaskBarItem class is a item on the TaskBar that can close/restore a application
''' It represents the form's icon and text on the visual side
''' </summary>
''' <remarks></remarks>
Public Class TaskBarItem
    Inherits ToolStripMenuItem

    Private WithEvents CloseItem As New ToolStripMenuItem("Close")
    Private WithEvents RestoreItem As New ToolStripMenuItem("Restore")
    Friend WithEvents Control1 As System.Windows.Forms.Control

    Private _form As Form


    ''' <summary>
    ''' Creates a new instance of the TaskBarItem class
    ''' </summary>
    ''' <param name="text">The text used on the item</param>
    ''' <param name="img">The image used on the item</param>
    ''' <param name="frm">The form that is linked to it</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal text As String, ByVal img As Image, ByVal frm As Form)
        MyBase.New(text, img)
        CloseItem.BackColor = color.black
        CloseItem.ForeColor = color.deepskyblue
        RestoreItem.BackColor = color.black
        RestoreItem.ForeColor = color.deepskyblue
        BackColor = color.black
        ForeColor = color.deepskyblue
        _form = frm
        AddHandler CloseItem.Click, AddressOf Close_Click
        AddHandler RestoreItem.Click, AddressOf Restore_Click

        AddHandler frm.FormClosing, AddressOf Form_Closed

        Me.DropDownItems.Add(CloseItem)
        Me.DropDownItems.Add(RestoreItem)
        frm.Show()
    End Sub

    '' A event to remove the item when the form has been closed by the close button
    '' or a internal Form.Close call
    Private Sub Close_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.Parent.Items.Remove(Me)
        If (Not IsNothing(_form)) Then
            _form.Close()
        End If
    End Sub

    '' A event to restore the form's previous state
    Private Sub Restore_Click(ByVal sender As Object, ByVal e As EventArgs)
        If (_form.WindowState = FormWindowState.Minimized) Then
            _form.WindowState = FormWindowState.Normal
            _form.Visible = True
        End If
    End Sub

    '' A event to close the form using the TaskBarItem
    Private Sub Form_Closed(sender As Object, e As FormClosingEventArgs)
        For Each tsmi As ToolStripMenuItem In GalaxyOs.Core.GUI.Desktop.Desktop.TaskBar.Items
            If (tsmi.Text = _form.Text) Then
                Me.Parent.Items.Remove(tsmi)
                Exit For
            End If
        Next
    End Sub
End Class
End Namespace
Namespace Core.GUI.Desktop.Taskbar
''' 
''TaskBarItem类是任务栏上可以关闭/恢复应用程序的项目
''它代表窗体的图标和视觉侧的文本
''' 
''' 
公共类TaskBarItem
继承ToolStripMenuItem
Private WithEvents CloseItem作为新工具条带菜单项(“关闭”)
Private with Events RestoreItem作为新的ToolStripMenuItem(“还原”)
Friend WithEvents Control1作为System.Windows.Forms.Control
私有形式作为形式
''' 
''创建TaskBarItem类的新实例
''' 
''项目上使用的文本
''项目上使用的图像
“链接到它的窗体”
''' 
Public Sub New(ByVal文本作为字符串,ByVal img作为图像,ByVal frm作为表单)
MyBase.New(文本,img)
CloseItem.BackColor=color.black
CloseItem.ForeColor=color.deepskyblue
RestoreItem.BackColor=color.black
RestoreItem.ForeColor=color.deepskyblue
BackColor=color.black
前景色=颜色。深天蓝
_形式=frm
AddHandler CloseItem.单击,关闭地址\u单击
AddHandler RestoreItem.单击,还原地址\u单击
AddHandler frm.FormClosing,Form_的地址已关闭
Me.DropDownItems.Add(CloseItem)
Me.DropDownItems.Add(RestoreItem)
frm.Show()
端接头
“”是一个事件,用于在通过关闭按钮关闭窗体时删除该项
“”或内部窗体。关闭调用
私有子关闭\单击(ByVal发送方作为对象,ByVal e作为事件参数)
Me.Parent.Items.Remove(Me)
如果(不是什么(_形式))那么
_表.结束()
如果结束
端接头
“”是用于还原窗体以前状态的事件
私有子还原\u单击(ByVal发送方作为对象,ByVal e作为事件参数)
如果(_form.WindowState=FormWindowState.Minimized),则
_form.WindowState=FormWindowState.Normal
_form.Visible=True
如果结束
端接头
“”使用TaskBarItem关闭窗体的事件
私有子表单_关闭(发送方作为对象,e作为FormClosingEventArgs)
对于GalaxyOs.Core.GUI.Desktop.Desktop.TaskBar.Items中的每个tsmi作为ToolStripMenuItem
如果(tsmi.Text=_form.Text),则
Me.Parent.Items.Remove(tsmi)
退出
如果结束
下一个
端接头
末级
结束命名空间
我是一个彻头彻尾的傻瓜,我真的被困在这个

非常感谢您的帮助,
哈姆扎·阿里

我把问题解决了!问题是,我在MDI父窗体上有一个flowlayoutpanel,它位于前台,让MDI子窗体显示在后台。FlowLayoutPanel是否有任何方式不妨碍MDI子级

谢谢,
Hamza Ali

不清楚您在做什么:
frm.MdiParent=Me
如果该行在模块中,则无法编译,因为Me不会引用表单。在设置MdiParent属性之前,我不会尝试显示表单。哎呀,我是想把桌面放在那里……我现在就更改它。好吧,这很清楚。什么是GalaxyOS.Core.GUI.Desktop?这看起来不像是引用MDI父窗体的实例。哦,是的,它在设置MDI父窗体属性后显示窗体。
GalaxyOS.Core.GUI.Desktop
是桌面窗体,它只是被放在名称空间中以便于导航。这个项目有超过125个表单,因此将所有内容放在一个名称空间中可以更容易地导航到正确的表单,同时要记住,有多个表单具有相同的名称。对不起,我之前没有解释。