【问题标题】:Problem with icon on creating new maximized MDI child form in .NET在 .NET 中创建新的最大化 MDI 子窗体时出现图标问题
【发布时间】:2009-05-20 16:11:21
【问题描述】:

我有一个 .NET 3.5 MDI WinForms 应用程序。

我设置了一个子表单的Icon 属性,并且图标正确显示在表单的左上角。然后我最大化子窗体,图标仍然可以。

在子窗体仍然最大化的情况下,我打开另一个子窗口,它会自动最大化。此表单的图标不是 Icon 属性中的图标,而是默认的 .NET 图标(带有蓝色、红色和黄色方块的那个)。但是,如果我调整大小 MDI 父窗体,图标会自行重置并正确显示。

有没有人有解决方法或知道为什么会发生这种情况?

【问题讨论】:

  • 您是否尝试过在打开子窗口后对其进行 .Refresh 操作?

标签: .net winforms icons mdi


【解决方案1】:

对 Calanus 的解决方案稍作修改:

    private void MdiBase_Load(object sender, EventArgs e)
    {
        // Fixes bug where loading form maximised in MDI window shows incorrect icon.
        this.Icon = Icon.Clone() as Icon;
    }

这允许您在设计时设置图标(就像其他表单一样),并且不需要任何硬编码文件或资源访问。

【讨论】:

  • 对我来说,这在 MDI 子表单中添加代码时有效;而该示例建议将代码放在 MDI 父窗体中。
【解决方案2】:

没错,我找到了解决办法……

解决方法是在子窗体的加载事件上再次设置图标,如下所示:

private void StatsForm_Load(object sender, EventArgs e)
{
    //bug that means you have to set the desired icon again otherwise it reverts to default when child form is maximised
    Icon = new System.Drawing.Icon("research.ico");
}

这确实意味着您必须首先将相关图标文件添加到您的 VS 项目/解决方案中,并将其设置为“始终复制”,以便在构建解决方案时进行复制。

HTH 卡兰斯

【讨论】:

  • 像魅力一样工作。谢谢。无论出于何种原因,我从未想过尝试重置图标。它还可以用作嵌入式资源,因此最终目录中没有大量(可替换)文件。
【解决方案3】:

我发现唯一的解决方案是停用然后重新激活 MDI 子项:

document.Show();
// Work-around for error in WinForms that causes MDI children to be loaded with the default .NET icon when opened maximised.
ActivateMdiChild(null);
ActivateMdiChild(document);

这是this reply on MSDN forums 中给出的解决方案,它对我有用。

【讨论】:

  • 它可以工作,但是如果你在任何地方使用 ShowDialog 就会产生问题。
  • 如果您在代码中使用 ShowDialog 而不是 Show,该调用的执行会阻塞。只有在关闭对话框后,对 ActivateMdiChild 的调用才会运行,但第二个调用将不起作用,因为此时 document 不再存在
【解决方案4】:
private void frmChild_Shown(object sender, EventArgs e)
{
    // Work-around for maximized BUG
    this.Icon = this.MdiParent.Icon;
    this.WindowState = FormWindowState.Normal;
    this.WindowState = FormWindowState.Maximized;
}

【讨论】:

    【解决方案5】:

    我发现这也可以解决问题。

    myForm.WindowState = FormWindowState.Normal;
    myForm.Show();
    myForm.WindowState = FormWindowState.Maximized;
    

    【讨论】:

      【解决方案6】:

      我的解决方案: 将 MdiChild“ShowIcon”属性设置为 true,分配一个 1x1 透明图标。问题解决了。

      【讨论】:

      • 也许我遗漏了一些东西,但我不确定这如何适用于我原来的问题。问题不在于我不想要一个图标时显示,而是 我想要显示的图标 没有显示,而是被默认替换。
      【解决方案7】:
      form.WindowState = FormWindowState.Normal
      form.Show()
      form.WindowState = FormWindowState.Maximized
      form.Show()
      

      解决了我的问题!

      【讨论】:

        【解决方案8】:

        在 MDI Children 的 Form_Load 方法中将其添加为第一行对我有用:

        this.Icon = new Icon(this.Icon, this.Icon.Size);
        

        【讨论】:

          【解决方案9】:

          我发现解决此问题的最佳解决方法是here

          aNewForm.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
          AddHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged
          
          aNewForm.Show()
          aNewForm.WindowState = FormWindowState.Maximized
          
          RemoveHandler aNewForm.SizeChanged, AddressOf Form_SizeChanged
          

          处理程序

          Protected Sub Form_SizeChanged(ByVal sender As Object, ByVal e As EventArgs)
          
              If WindowState = FormWindowState.Maximized Then
                  If FormBorderStyle <> FormBorderStyle.Sizable Then FormBorderStyle = FormBorderStyle.Sizable
              End If
          
          End Sub
          

          【讨论】:

            猜你喜欢
            • 2010-09-23
            • 2012-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-13
            • 2023-04-06
            相关资源
            最近更新 更多