C#:创建一个触发事件的自定义控件文本框

时间:2017-08-03 01:41:45

标签: c# winforms events textbox custom-controls

我正在制作一个自定义控件文本框,其中包含Cue (填充文字)CueColor (填充文字颜色)属性。我在文本框中创建了EnterLeave事件来规范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;
            }
        }
    }

1 个答案:

答案 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实例的设计图面时,可以调试控件的代码。将触发断点并显示异常。