Использование базовых классов в WPF - PullRequest
1 голос
/ 29 октября 2009

У меня проблема с базовыми классами в 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? Спасибо

Ответы [ 3 ]

3 голосов
/ 29 октября 2009

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

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, вам нужно убедиться, что ваше представление является 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>

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

1 голос
/ 29 октября 2009

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

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

0 голосов
/ 29 октября 2009

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

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

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

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

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

...