C#覆盖属性

C#覆盖属性,c#,.net,winforms,C#,.net,Winforms,我有一个有文本框和面板的控件。我需要从文本框中的面板前景色转换。我这样做了,但不起作用 public Color ForeColor { get { return transparentTextBox.ForeColor; } set { transparentTextBox.ForeColor = value; } } 分步骤执行此操作: 不要将文本框和面板暴露给外部世界,使其成为私有控件(对包含它们的控件私有)

我有一个有文本框和面板的控件。我需要从文本框中的面板前景色转换。我这样做了,但不起作用

public Color ForeColor
{
    get
    {
        return transparentTextBox.ForeColor;
    }
    set
    {
        transparentTextBox.ForeColor = value;
    }
}
分步骤执行此操作:

  • 不要将
    文本框
    面板
    暴露给外部世界,使其成为私有控件(对包含它们的
    控件
    私有)。您的控件可能会公开文本等属性(然后文本会在文本框上获取/设置相同的属性)

  • 公开类型为
    Color
    PanelColor
    属性。设置此属性后,在
    面板
    文本框
    中设置该颜色


  • 这样,您的
    控件只会公开它必须公开的属性(原则),您可以根据需要对属性更改做出任何反应。

    我不知道该属性是什么,但它不是一个
    重写,也不是一个事件处理程序,因此它无法工作。我认为做你想做的事情最好的方法就是设定目标

    transparentTextBox.ForeColor = pnl.ForeColor;
    
    在控件的初始化中

    如果其他人要更改面板的前景色,请创建一个方法或属性

    pnl.ForeColor = givenValue;//givenValue is the value the user gave to change the panel's foreColor
    transparentTextBox.ForeColor = givenValue;
    
    例如,此userControl可执行以下操作:

    public partial class UserControl1 : UserControl
    {
      private System.Windows.Forms.Panel panel1;
      private System.Windows.Forms.TextBox textBox1;
      public UserControl1()
      {
         InitializeComponent();
         this.panel1 = new System.Windows.Forms.Panel();
         this.textBox1 = new System.Windows.Forms.TextBox();
         this.panel1.Controls.Add(this.textBox1);
         this.panel1.Location = new System.Drawing.Point(3, 14);
         this.panel1.Name = "panel1";
         this.panel1.Size = new System.Drawing.Size(200, 100);
         this.panel1.TabIndex = 0;
         this.textBox1.Location = new System.Drawing.Point(33, 15);
         this.textBox1.Name = "textBox1";
         this.textBox1.Size = new System.Drawing.Size(100, 20);
         this.textBox1.TabIndex = 0;
         this.Controls.Add(this.panel1);
    
         textBox1.ForeColor = panel1.ForeColor;
      }
    
      public Color ForeColor
      {
         get
         {
            return textBox1.ForeColor;
         }
         set
         {
            panel1.ForeColor = value;
            textBox1.ForeColor = value;
         }
      }
    }
    

    也许是这样的:

    class MyTextBox : TextBox // custom textbox
    {
        protected override void OnParentForeColorChanged(EventArgs e)
        {
            ForeColor = Parent.ForeColor;
    
            Invalidate();
            base.OnParentForeColorChanged(e);
        }
    }
    

    但是还有其他的解决办法。

    我也有同样的问题。不要覆盖ForeColor属性,请执行以下操作:

    private Color _foreColor = null;
    
    public Color ForeColor
    {
        get
        {
            if(_forecolor == null)
            {
             _foreColor = transparentTextBox.ForeColor;
            }
    
            return _foreColor;
        }
    }
    
        public UserControl1()
        {
            InitializeComponent();
            ForeColorChanged += UserControl1_ForeColorChanged;
        } 
    
        void UserControl1_ForeColorChanged(object sender, EventArgs e)
        {
            textBox1.ForeColor = ForeColor;
        }
    

    这不是一个非常漂亮的方法,但它是有效的:)

    定义“不起作用”。您是否使用过调试或断点来查看发生了什么?如果定义了transparentTextBox?不太明白“不工作”是什么意思。它是否抛出异常?“不工作”。不变色Font@mzk
    一个包含文本框和面板的控件
    ->您应该发布更多的代码以使其更清晰。谁说过事件处理程序?OP试图将内部对象的属性公开给外部类。