2009-10-29 3 views
1

У меня проблема с базовыми классами в WPF. Я пытаюсь сделать базовый класс с некоторыми базовыми элементами, чтобы другие окна могли наследовать эти компоненты. Но все, что у меня есть, когда я наследую базовый класс, - это только пустое окно, без этих элементов. Для лучшего понимания я положил мой код здесь:Использование базовых классов в WPF

using XSoftArt.WPFengine; 

namespace XSoftArt 
{ 

    public class WindowBase : Window 
    { 

    public WindowBase() 
    { 

    } 

}

кодекс Windows, ведьма наследуется WindowBase:

namespace XSoftArt.WPFengine 
{ 
    public partial class NewAbility : WindowBase 
    { 
     public NewAbility() 
     { 
      base.ChildForm = this; InitializeComponent(); 

     } 
    } 
} 

Или, может быть, кто-то может поставить рабочий пример или ссылку с реализовали базовые классы в wpf? Thanks

ответ

0

Я не думаю, что когда-либо использовал бы наследование в WPF, как вы его пытаетесь использовать.

Я попытаюсь взять удар, отвечая на ваш вопрос. Если вы правильно поняли, вы пытаетесь сделать что-то вроде этого:

  1. Вы создаете окно, в котором есть файл XAML и код.
  2. Вы добавляете «базовые элементы» в XAML для своего окна ... Я не уверен, что вы подразумеваете под «базовым элементом», но я собираюсь предположить, что вы имеете в виду, что добавляете элементы пользовательского интерфейса в ваше окно.
  3. Вы создаете другое окно, которое «выводится» из вашего первого окна в коде, и проблема в том, что вы не видите элементы интерфейса на нем из вашего «базового» окна.

Если это то, что вы хотите достичь с помощью WPF, я лично рекомендую против него, только потому, что я лично не поклонник наследования и видел своими глазами опасность того, чтобы позволить наследование получить из рук.

Вместо этого вы можете организовать свои «базовые» элементы пользовательского интерфейса в WPF UserControls. This tutorial может помочь вам в правильном направлении. Удачи!

+0

Что заставляет вас говорить, что это принципиально неправильно и невозможно? Кажется, что-то вроде прыжка, не так ли? –

+0

@ Андерсон, ну, это зависит от того, понял ли я вопрос ОП. Если бы я это сделал, и он говорит о наследовании из файла XAML в файл XAML, просто наследуя его от другого класса управления, тогда нет, это невозможно. XAML просто не работает. Если я его неправильно понял, то, возможно, есть способ, но я бы серьезно сомневался, было бы разумно пойти по этому пути в WPF, основываясь на том, как ОП описал это. –

+0

Хотя, может быть, я ошибаюсь. Я отредактировал свой ответ, чтобы отразить это. –

3

Я не думаю, что вам действительно нужно делать то, что вы делаете, , но это возможно. Я думаю, вы просто забываете вызвать конструктор базового класса.

using XSoftArt.WPFengine; 

namespace XSoftArt 
{ 

    public class WindowBase : Window 
    { 

     //call base ctor 
     public WindowBase() : base() 
     { 

     } 

    } 
} 

Вы должны будете сделать это из ваших унаследованных классов, а также:

namespace XSoftArt.WPFengine 
{ 
    public partial class NewAbility : WindowBase 
    { 
     public NewAbility() : base() 
     { 
      base.ChildForm = this; InitializeComponent(); 

     } 
    } 
} 

И если у вас также есть XAML определенного вида, вам необходимо убедиться, что ваш взгляд является a WindowBase. Чтобы сделать это, изменить это:

<Window x:Class="MyApp.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    ... 
    > 
    <Grid>   
    </Grid> 
</Window> 

к этому:

<local:WindowBase x:Class="MyApp.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:XSoftArt;" 
    ... 
    > 
    <Grid>   
    </Grid> 
</local:WindowBase> 

Если вы посмотрите на этот класс в Рефлектор вы увидите, что конструктор вызывает собственные «) Initialize (» метод класса окна, в который задает много вещей в движении. В частности, он, похоже, подключается к диспетчеру, который является рабочей очередью для всех событий пользовательского интерфейса.

+0

Этот вопрос не помог. Я помещал некоторые элементы пользовательского интерфейса в свою WindowBase. Эти элементы я буду в новом окне, whitch наследует WindowBase. В моем другом окне также есть некоторые элементы пользовательского интерфейса, но с унаследованием такого типа, когда я вызываю ShowDialog только пустые окна (нет элементов WindowBase, нет элементов окна NewAbility). – Vytas

+0

У вас есть файл с кодом XAML? Если это так, вам нужно убедиться, что вы указываете правильный тип в своем файле. Я уточню это в своем ответе. –

+0

Ваш ответ вводит в заблуждение, так как безразмерный конструктор базового класса автоматически вызывается в C# при вызове конструктора без параметров в суперклассе. http://stackoverflow.com/questions/18097/in-c-do-you-need-to-call-the-base-constructor – jpierson

1

В частности, вы хотите убедиться, что вызывается метод InitializeComponent() базового класса - это функция, которая создает элементы управления, определенные вами в XAML.

Создание производного класса отлично, если вы хотите наследовать элементы управления и поведение, но подумайте об использовании Templates для более гибкого способа управления общим набором элементов управления.

+1

Я просмотрел документы для Window и, похоже, не имеет метода InitializeComponent ? http://msdn.microsoft.com/en-us/library/system.windows.window_methods.aspx Я думаю, что вы можете ссылаться на метод InitializeComponent codegen'd из фактического представления. Кажется, что OP уже делает это правильно. Я согласен с использованием шаблонов над элементами управления с WPF, хотя ... там хорошо. –

Смежные вопросы