从非xaml.cs超类调用InitializeComponent()

时间:2019-01-13 15:47:13

标签: c# wpf

// BaseObjectWindow.cs
public partial class BaseObjectWindow : Window {

    public BaseObjectWindow() {
        // I want to call InitializeComponent() here
    }

    //more constructors

}

// AccountWindow.xaml.cs
public partial class AccountWindow : BaseObjectWindow {

    // I want to remove this whole constructor
    public AccountWindow() : base() {
        InitializeComponent();
    }
}

我希望能够从基类中调用InitializeComponent(),所以不必在子类中调用它。我想这样做的原因是因为BaseObjectWindow有多个构造函数,并且如果您定义了至少一个构造函数,C#将拒绝隐式继承所有构造函数。

我想我可以通过绕过为每个我需要创建的子类窗口声明所有构造函数(至少20个)来节省很多时间,但是如果我不能调用{{1 }}从超类开始,否则子类窗口初始化为一个空窗口。

有什么办法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以做的是在基类中声明一个虚拟/抽象方法,该方法在构造函数中调用。在派生类中重写它,然后在其中调用InitializeComponent
注意:在构造函数中调用虚拟方法可能会导致一些问题。另请参见Virtual member call in a constructor

据我所知在这种情况下应该没有任何问题,如果我错了,请有人纠正我。

public abstract class BaseWindow : Window
{
    protected BaseWindow()
    {
        OnInitialize();
    }

    public abstract void OnInitialize();
}
public partial class DerivedWindow : BaseWindow
{
    public override void OnInitialize()
    {
        InitializeComponent();
    }
}