Вызов конструкторов в многоуровневом наследовании WPF C # - PullRequest
0 голосов
/ 27 апреля 2011

У меня проблемы с вызовом базовых конструкторов в окнах wpf:

public class TemplateWindow : Window //Template window class
{
    public TemplateWindow (int no)
    {
    }
}

public partial class MainView : TemplateWindow
{
    public MainView() : base(1) //error here
    {
        InitializeComponent();
    }
}

Это дает мне ошибку в указанном месте, поскольку он, очевидно, пытается вместо этого вызвать конструктор Window с base. Класс MainView - это код окна xaml.

Однако, когда я проверил проблему, как показано ниже, она прекрасно работает.

class A //Base Class
{
    public A() { }
}

class B : A
{
    public B(int no) { }
}

partial class C : B
{
    public C() : base(1) { }
}

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Ваш класс MainView определен в XAML, не так ли?Вероятно, это выглядит примерно так:

<Window x:Class="MyNamespace.MainView" ... >
    ...
</Window>

Обратите внимание на большое Window слово в самом начале.Он сообщает компилятору, что вы хотите, чтобы этот XAML генерировал класс с именем MyNamespace.MainView, и вы хотите, чтобы он наследовал от Window.Вот что делает компилятор: он успешно генерирует ваш класс и наследует от Window.Щелкните правой кнопкой мыши слово InitializeComponent и выберите «Перейти к определению».Это приведет вас к автоматически сгенерированному файлу, и вы сможете увидеть класс.

Теперь, если вы хотите, чтобы MainView наследовал от TemplateWindow, вам просто нужно сказать это в вашем XAML.:

<my:TemplateWindow 
    xmlns:my="MyNamespace" 
    x:Class="MyNamespace.MainView" ... >
    ...
</my:TemplateWindow>

Но это создаст вам еще одну проблему: теперь внезапно вы не сможете использовать визуальный дизайнер.

Это может произойти из-за того, что дизайнер не может создать экземплярвашего TemplateWindow класса для редактирования.Зачем?Ну, потому что TemplateWindow, конечно, не имеет конструктора по умолчанию!

Так что для такого рода работы вам нужно просто определить два конструктора в TemplateWindow - один по умолчанию иодин принимает int.

Удачи.

0 голосов
/ 27 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...