我正在制作一个自定义控件文本框,其中包含Cue
(填充文字)和CueColor
(填充文字颜色)属性。我在文本框中创建了Enter
和Leave
事件来规范Cue。但是,当我尝试应用它时,它会崩溃我的IDE(Visual Studio 2015,如果这有帮助的话)。
我已经阅读了一些类似问题的帖子: Winforms user controls custom events
虽然我不太确定我的问题是否有相同的解决方案。我如何使其工作?为清晰起见,这是我的代码:
class CueTextBox : TextBox
{
public string Cue
{
get { return Cue; }
set { Cue = value;}
}
public Color CueColor
{
get { return CueColor; }
set { CueColor = value; }
}
private void CueTextBox_Enter(object sender, EventArgs e)
{
TextBox t = sender as TextBox;
if (t.ForeColor == this.CueColor)
{
t.Text = "";
t.ForeColor = this.ForeColor;
}
}
private void CueTextBox_Leave(object sender, EventArgs e)
{
TextBox t = sender as TextBox;
if (t.Text.Trim().Length == 0)
{
t.Text = Cue;
t.ForeColor = this.CueColor;
}
}
}
答案 0 :(得分:1)
我在代码中唯一看到的是属性定义以递归方式调用自身,这会在将控件添加到设计图面时导致堆栈溢出。
public string Cue
{
get { return Cue; }
set { Cue = value;}
}
定义支持字段或使用自动实现的属性。
private string cue = String.Empty;
public string Cue
{
get { return cue; }
set { cue = value; }
}
或
public string Cue { get; set; }
您的问题暗示添加事件处理程序会导致问题。这有时可能是自定义控件的问题。有Control.DesignMode属性用于允许条件执行代码。但是,它不在构造函数中运行。你需要做一些黑客来确定IDE是否处于活动状态。
此属性可用于Visual Studio中的开发,以替代DesignMode
。
private bool InDesignMode
{
get
{
return (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) ||
base.DesignMode ||
(System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
}
}
在解决方案开发中,自定义控件是一种自虐的练习。您最好转到Project Properties-> Debug选项卡并设置" Start Action"到"启动外部程序"使用" devenv.exe"作为该计划。当你"运行"这将启动VS的新实例。调试器。将控件添加到新VS实例的设计图面时,可以调试控件的代码。将触发断点并显示异常。