2012-06-21 3 views
1

Обычная WPF архитектура:Создание абстрактный базовый класс для окон в WPF

public partial class MainWindow: Window { 

... InitializeComponent() 

} 

XAML: <Window x:Class="MainWindow"> </Window> 

То, что я хочу, чтобы перейти к:

public abstract class BaseWindow: Window { 

    public System.Windows.Controls.TextBlock control1; 
    public System.Windows.Shapes.Rectangle control2; 
    public System.Windows.Controls.TextBox control3; 

} 

public partial class AWindowImplementation { 

... InitializeComponent() 

} 

public partial class AnotherWindowImplementation{ 

... InitializeComponent() 

} 

XAML: 
<BaseWindow x:Class="AWindowImplementation"> </BaseWindow> 
<BaseWindow x:Class="AnotherWindowImplementation"> </BaseWindow> 

выше, является псевдо-код. Эта новая архитектура компилируется с предупреждениями о том, что реализации скрывают ограничения элементов управления (поскольку место, где я должен помещать ключевые слова «переопределить», связано с автогенерированным InitializeComponent). К сожалению, поля управления не заполняются.

Возможно ли это? То, что я пытаюсь сделать, это создать несколько дизайнов пользовательского интерфейса с тем же интерфейсом/элементами управления, чтобы остальная часть кода могла взаимодействовать с любым дизайном.

EDIT: Благодаря pchajer и Евгений, теперь у меня есть следующее рабочее решение, но я все еще получаю переопределить предупреждение:

public class MainWindowBase : Window 
{ 
    public TextBlock control1; 
    public Rectangle control2; 
    public TextBox control3; 

    static MainWindowBase() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindowBase), 
        new FrameworkPropertyMetadata(typeof(MainWindowBase))); 
    } 

    public override void OnApplyTemplate() 
    { 
     control1 = (TextBlock) FindName("control1"); 
     control2 = (Rectangle) FindName("control2"); 
     control3 = (TextBox) FindName("control3"); 
    } 

} 

<Style TargetType="{x:Type views:MainWindowBase}" 
      BasedOn="{StaticResource {x:Type Window}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type views:MainWindowBase}"> 
        <ContentPresenter />         
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

public partial class AWindowImplementation :MainWindowBase { 

... InitializeComponent() 

} 

<MainWindowBase x:Class="AWindowImplementation"> </MainWindowBase> 

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

+0

Вы говорите об переопределении, у вас есть абстрактный метод? –

+0

no, только поля, определенные в абстрактном классе, которые снова определены в подклассе с помощью автогенерированного кода InitializeComponent –

ответ

2

В WPF вы можете создать базовый класс, который наследуется от Window и имеет XAML. Но есть workground

Приведите эту ссылку - How to create a common WPF base window style?

+0

мой базовый класс не имеет xaml, но каждая реализация делает. спасибо, попробуем стратегию ссылки, и если она вернется и примет –

0

Я не уверен, как вы ожидаете, что псевдокод работает, поскольку ничего не называет ваш InitializeComponent. Обычно WPF называет это от вашего имени в конструкторе вашего окна. Но в вашем случае вы добавляете новую реализацию (а не переопределение), и ничего не вызывает ее.

Один из вариантов - просто вызвать новую реализацию из каждого конструктора подкласса. например. Конструктор AWindowImplementation может позвонить this.InitializeComponent().

Другой вариант - для BaseWindow для определения виртуального метода (скажем, InitializeComponentCore), который вызывает его конструктор. Базовые классы могут затем переопределить этот метод.

+0

InitializeComponent уже вызывается в конструкторе подкласса. поэтому я получаю предупреждение «скрывать». извините, если псевдокод неясен. –

0

Вы должны определить базовый класс для окна в качестве таможенного контроля. Просто создайте новый настраиваемый элемент управления, установите базовый класс в Window и затем вставьте стиль из blend (вы можете добавить свои компоненты). См. Также ответ от pchajer.

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