下面的代码是一个自定义控件。在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;
}
}
}
}发布于 2010-10-01 22:48:56
崩溃的发生是因为你的Font行为中有什么。您正在重写面板的字体属性的预期行为。将您的字体代码更改为下面的字体代码将使崩溃消失:
public override Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
_label.Font = value;
}
}发布于 2010-10-01 22:43:03
当在设计期间引发异常时,VS2005有崩溃到桌面的诀窍。这不可能是由您发布的代码引起的。我怀疑我们看到的是真正的代码,这个控件什么也做不了。
要小心构造函数和事件处理程序,它们也会在设计时运行。如果你做任何严重依赖于程序状态的事情,比如试图打开文件或与dbase服务器对话等等,那么通过检查this.DesignMode属性来避免运行这样的代码。
发布于 2010-10-01 22:56:20
我认为问题出在你的Font属性上,根据设计者如何处理面板及其内容的性质。默认情况下,标签的字体继承自其容器的字体(您可以通过向控件添加面板,然后向该面板添加标签来测试这一点。然后更改面板的字体,您的标签--除非您明确指定了一个非默认字体--将使用新的容器字体进行更新。
因此,当控件添加到窗体中时,label的Font将更新以匹配容器的Font,并且开始无限循环。
看起来你可以通过在创建标签时给它一个明确的字体来修复这个问题。像这样的东西似乎可以解决这个问题:
public CustomControlTest()
{
_label = new Label();
_label.Font = new Font("Ariel", 8.5f);
this.Controls.Add(_label);
} 作为对Hans的响应,我能够使用提供的代码和VS2008重现崩溃,并且我能够通过初始化字体来避免崩溃。
ETA2:在我之前的ETA中,我意识到我的回应可能听起来比我预期的更严厉。也许我应该详细说明一下,直到我尝试将控件添加到窗体中时,我才看到崩溃。Hans是对的,代码本身不应该导致Visual Studio崩溃……当设计者试图初始化和绘制控件时,它就会遇到问题。在这一点上,一个人如何直接向另一个人的帖子添加评论?是否需要一定的最低声誉?
https://stackoverflow.com/questions/3840108
复制相似问题