【问题标题】:C#: Create a Custom Control textbox which triggers eventsC#:创建一个触发事件的自定义控件文本框
【发布时间】:2017-08-03 01:41:45
【问题描述】:

我正在制作一个具有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;
            }
        }
    }

【问题讨论】:

标签: c# winforms events textbox custom-controls


【解决方案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 属性是为了允许有条件地执行代码。但是,它不在构造函数中运行。您需要做一些 hack 来确定 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");
            }
        }

自定义控件的解决方案开发是一种自我滥用的练习。您最好转到项目属性-> 调试选项卡并将“启动操作”设置为“启动外部程序”,并将“devenv.exe”作为程序。当您“运行”调试器时,这将启动一个新的 VS 实例。当您将控件添加到新 VS 实例的设计图面时,您可以调试控件的代码。将命中断点并显示异常。

【讨论】:

  • 哇哦。谢谢!你刚刚让我免于头痛。没想到会是这个错误。 :)
  • @DonovanKeating,我添加了一些您可能会发现对进一步开发自定义控件有用的信息。
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 2016-02-29
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多