【问题标题】:Problems with MDI in Windows XPWindows XP 中的 MDI 问题
【发布时间】:2010-01-13 20:38:48
【问题描述】:

我正在开发一个使用 MDI 的 .NET 2.0 WinForms 应用程序。

当我在 Windows 7 下对其进行测试时,它可以完美运行,但是当我在 Windows XP 中安装完全相同的应用程序时,子窗口不再是 MDI 窗口。我可以将它们拖出它们的父窗口。

有人对这种奇怪的行为有解释吗?

更新:它适用于 Windows 7 和 Vista。它在 XP 上构建时可以在 XP 上运行,但是构建项目并将其部署到 XP 然后它就不起作用了。这越来越陌生了。

代码(我删掉了不处理表格的部分)

Imports Model = TakeHomeModel
Imports System.Windows.Forms

Public Class MainForm

Private WithEvents gebruikers As frmGebruikers
Private WithEvents fotos As frmFotos
Private WithEvents tweets As frmTweets
Private rapport As frmReport
Private zoeker As New frmZoek

Private Sub GebruikersToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GebruikersToolStripMenuItem.Click
    If gebruikers.Visible = False Then
        gebruikers.Show()
    Else
        gebruikers.Hide()
    End If
End Sub

Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Icon = My.Resources.appico
    Model.InitDatabase(My.Application.Info.DirectoryPath & "\takehome.accdb")
    gebruikers = New frmGebruikers
    fotos = New frmFotos
    tweets = New frmTweets
    rapport = New frmReport
    rapport.MdiParent = Me
    gebruikers.MdiParent = Me
    fotos.MdiParent = Me
    tweets.MdiParent = Me
    zoeker.MdiParent = Me
End Sub

Private Sub FotosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FotosToolStripMenuItem.Click
    If fotos.Visible = False Then
        fotos.Show()
    Else
        fotos.Hide()
    End If
End Sub

Private Sub TweetsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TweetsToolStripMenuItem.Click
    If tweets.Visible = False Then
        tweets.Show()
    Else
        tweets.Hide()
    End If
End Sub

End Class

【问题讨论】:

  • 完成了,我剪掉了不相关的部分(它们绝对不接触表格)
  • 顺便说一句,您可以通过写gebruikers.Visible = Not gebruikers.Visible来切换表单的可见性。

标签: .net vb.net winforms mdi


【解决方案1】:

好的,更新。我尝试通过 P/Invoke 执行此操作(获取 MDICLIENT“窗口”的 hWnd 并将其设置为父级(SetParentA))并且没有区别(仍然在 Win7 上工作,而不是在 XP 上)。似乎 XP 真的不喜欢 MDI。

【讨论】:

    【解决方案2】:

    在 Windows XP Windows 窗体中使用 MDI 子级没有问题。我们做的很广泛。

    我想你有一些东西干扰了 MDI 孩子在那台电脑上工作的方式。

    我会尝试在不同的(如果可能的话,全新安装)Windows XP 机器上运行,以消除与图形驱动程序、安装影响窗口布局的第三方工具等相关的任何问题。

    您使用的是标准 Windows 窗体还是使用了影响 MDI 的第三方控件?例如。例如,将 MDI 窗口转换为选项卡的 Janus 或 Dev Express?

    【讨论】:

    • 没有第 3 方组件,都是原版 .NET 2.0。而且XP安装很干净,是我7的Windows XP Mode。我让一个朋友在 VM 中全新安装 XP 时对其进行了测试,但没有成功。我还在 Vista 上测试了该应用程序,它在那里运行良好。
    【解决方案3】:

    一种可能性是,如果子表单在被分配 mdiparent 属性之前正在加载。这可能发生在初始化过程中引用子表单内部的任何内容,无论是从外部引用还是可能作为“新”分配的结果。

    【讨论】:

    • 我会尝试,但为什么它在 Windows 7 中有效,而在 XP 中无效?
    • 好的,试过了,但是不能在设计器中设置mdi parent。
    • 你是对的——我已经编辑了答案。这可能是原因的一个原因是某些控件具有在初始化时触发的事件,并且此行为在 Windows 版本之间不一致。您可以尝试在加载子表单时分配 mdiparent,而不是在加载主表单时分配它。
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多