Обычная 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 в производном классе. Но в любом случае это работает сейчас.
Вы говорите об переопределении, у вас есть абстрактный метод? –
no, только поля, определенные в абстрактном классе, которые снова определены в подклассе с помощью автогенерированного кода InitializeComponent –