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

3

我已经从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);
     }
}

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


1
那样做行不通。C#不支持多重继承,你需要考虑封装代替。 - Hans Passant
2个回答

4
您需要手动重新创建每个要从 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 */

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

这正是我试图避免的。+1。难道没有其他办法吗? - jay_t55
这并不是有帮助的,你无法现实地实现自己的TextBox控件。 - Hans Passant
@HansPassant:如果所有的OP要做的就是给控件添加一些边框,那么这完全在可能范围之内。 - Brad Christie
等一下...如果我在Ctrl中实现了一些东西,然后重新创建TextBox,我可以只让TextBox的重建为空,因为它的实现已经在Ctrl中实现了,对吧?:public class Ctrl : Control { // implementation... } public class TextBoxControl : Ctrl { } button1_Click(object sender, EventArgs e) { TextBoxControl tbc = new TextBoxControl() { Location = new Point(0, 0) }; this.Controls.Add(tbc); 这样行得通吗?还是这样做的方法不对? - jay_t55
实现边框并不难,难的是 TextBox 控件所做的其他事情。从头开始创建文本编辑器是一项艰巨的工作。很明显,如果您必须添加一百个方法来弥补一个方法的重用,那么就没有任何好处了。如果您有某种封装方案,请注意您的回答非常不清楚。 - Hans Passant
文本框不会触发OnPaint方法。您必须重写WndProc才能获取绘制消息。但是这仍然不会让您更轻松地解决文本框无法正确绘制边框而出现闪烁问题的问题。 - LarsTech

1

你不能这样做,除非你重新学习所有所需的课程,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接