如何使所有新控件继承新的扩展控件

本文关键字:控件 继承 扩展 何使所 新控件 | 更新日期: 2023-09-27 18:24:42

我从Control扩展而来,如下所示:

public class Ctrl : Control
{
     public Boolean HasBorder { get; set; }
     public Boolean ShouldDrawBorder { get; set; }
     protected override void OnPaint(PaintEventArgs e)
     {
          if(CertainConditionIsMet)
          {
               // Then draw the border(s).
               if(this.BorderType == BorderTypes.LeftRight)
               {
                   // Draw left and right borders around this Ctrl.
               }
           }
           base.OnPaint(e);
     }
}

但是,当我将new TextBox();添加到Form时,它仍然继承自Control,而不是继承自Ctrl。如何使所有新控件从Ctrl继承?

如何使所有新控件继承新的扩展控件

您必须手动重新创建要从Ctrl继承的每个控件。例如

public class TextBoxCtrl : Ctrl
{
  /* implementation */
}

编辑:

为了避免不得不重新发明轮子,我可能会用以下方式来处理它:

首先,将添加的属性作为接口的一部分,这样它就更像是一个可以移交的控件:

public interface ICtrl
{
    Boolean HasBorder { get; set; }
    Boolean ShouldDrawBorder { get; set; }
}

接下来,(在一个单独的类中)制定一个助手方法来处理UI增强:

public static class CtrlHelper
{
    public static void HandleUI(Control control, PaintEventArgs e)
    {
        // gain access to new properties
        ICtrl ctrl = control as ICtrl;
        if (ctrl != null)
        {
            // perform the checks necessary and add the new UI changes
        }
    }
}

接下来,将此实现应用于您想要自定义的每个控件:

public class TextBoxCtrl : ICtrl, TextBox
{
    #region ICtrl
    public Boolean HasBorder { get; set; }
    public Boolean ShouldDrawBorder { get; set; }
    #endregion
    protected override void OnPaint(PaintEventArgs e)
    {
        CtrlHelper.HandleUI(this, e);
        base.OnPaint(e);
    }
}
/* other controls */

现在,您可以保留每个控件的大部分原始功能,保留其继承,并在一个位置以最小的工作量扩展功能(或更改原始控件)。

除非您重做所有需要的类,否则您无法做到这一点,例如:

public class ExtendedTextBox : Ctrl
{
    //implement the thing here
}