【问题标题】:Custom control cause Visual Studio 2008 to CRASH自定义控件导致 Visual Studio 2008 崩溃
【发布时间】:2011-04-19 21:35:59
【问题描述】:

以下代码是一个自定义控件。在 Visual Studio 设计器中使用此控件会导致 Visual Studio 在没有任何明显细节的情况下崩溃。

我正在使用 Visual Studio 2008。

我在这里做错了吗?

using System;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace InstalacionesSayma.GUI
{
    public class CustomControlTest : Panel
    {
        private Label _label;

        public CustomControlTest()
        {
            _label = new Label();
            this.Controls.Add(_label);
        }

        public override Font Font
        {
            get
            {
                return _label.Font;
            }
            set
            {
                _label.Font = value;
            }
        }
    }
}

【问题讨论】:

  • 我不确定,但我会从构造函数中删除 this.Controls.Add(_label); 并将其放在其他位置 - 如果您有 *.Design.cs,请在此处进行设置...跨度>

标签: c# .net winforms crash custom-controls


【解决方案1】:

崩溃的发生是因为您的字体行为。您正在覆盖面板的 Font 属性的预期行为。将您的字体代码更改为以下代码会使崩溃消失:

 public override Font Font
  {
     get
     {
        return base.Font;
     }
     set
     {
        base.Font = value;
        _label.Font = value;
     }
  }

【讨论】:

    【解决方案2】:

    VS2005 有在设计时引发异常时崩溃到桌面的诀窍。这不是由您发布的代码引起的。我怀疑我们正在查看真正的代码,这个控件没有做任何事情。

    小心构造函数和事件处理程序,它们也会运行设计时。如果您执行的任何操作严重依赖于程序的状态,例如尝试打开文件或与 dbase 服务器通信等,请通过检查 this.DesignMode 属性来避免运行此类代码。

    【讨论】:

      【解决方案3】:

      我认为问题在于您的 Font 属性,因为设计器在面板及其内容方面的工作方式的性质。默认情况下,标签的字体继承自其容器的字体(您可以通过向控件添加面板来测试这一点,然后向该面板添加标签。然后更改面板的字体和 viola,您的标签 - - 除非你明确地给它一个非默认字体 - 将使用新的容器字体更新)。

      因此,就目前而言,当控件添加到表单时,标签的字体会更新以匹配容器的字体,并开始无限循环。

      看起来您可以通过在创建标签时为其指定明确的字体来解决此问题。这样的事情似乎可以解决这个问题:

         public CustomControlTest() 
          { 
              _label = new Label(); 
              _label.Font = new Font("Ariel", 8.5f);
              this.Controls.Add(_label); 
          } 
      

      ETA:作为对 Hans 的回应,我能够使用提供的代码和 VS2008 重现崩溃,并且我能够通过初始化字体来避免崩溃。

      ETA2:在我之前的 ETA 中,我意识到我的反应听起来可能比我预期的更严厉。也许我应该详细说明一下,在我尝试将控件添加到表单之前我没有看到崩溃。 Hans 是对的,代码本身不应该导致 Visual Studio 崩溃……当设计人员介入并尝试初始化和绘制控件时,它会遇到问题。在那张纸条上,如何将 cmets 直接添加到另一个人的帖子中?是否需要一定的最低声望?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 2015-11-12
        相关资源
        最近更新 更多