在WPF中为windows创建抽象基类

在WPF中为windows创建抽象基类,wpf,user-interface,wpf-controls,Wpf,User Interface,Wpf Controls,通常的WPF架构: public partial class MainWindow: Window { ... InitializeComponent() } XAML: <Window x:Class="MainWindow"> </Window> 公共部分类主窗口:窗口{ …初始化组件() } XAML: 我想做的是: public abstract class BaseWindow: Window { public System.Windows.

通常的WPF架构:

public partial class MainWindow: Window {

... InitializeComponent()

}

XAML: <Window x:Class="MainWindow"> </Window>
公共部分类主窗口:窗口{
…初始化组件()
}
XAML:
我想做的是:

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>
公共抽象类BaseWindow:Window{
public System.Windows.Controls.TextBlock control1;
public System.Windows.Shapes.Rectangle control2;
public System.Windows.Controls.TextBox control3;
}
公共部分类AWINDOWIM实现{
…初始化组件()
}
公共部分类的另一个窗口实现{
…初始化组件()
}
XAML:
以上是伪代码。这个新的体系结构进行编译,并警告实现隐藏了控件定义(因为我应该放置“override”关键字的位置是自动生成的InitializeComponent)。不幸的是,控制字段没有填充

这是可以实现的吗?我试图做的是创建几个具有相同界面/控件的UI设计,以便其余代码可以与任一设计交互

编辑:多亏了pchajer和Yevgeniy,我现在有了以下工作解决方案,但我仍然收到覆盖警告:

 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>
公共类MainWindowBase:Window { 公共文本块控制1; 公共控制2; 公共文本框控件3; 静态MainWindowBase() { DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindowBase), 新的FrameworkPropertyMetadata(typeof(MainWindowBase)); } 应用程序模板()上的公共重写无效 { control1=(TextBlock)FindName(“control1”); control2=(矩形)FindName(“control2”); control3=(文本框)FindName(“control3”); } } 公共部分类AWindowImplementation:MainWindowBase{ …初始化组件() }
我想我必须在基类中使用不同的字段名来消除警告,或者可能删除派生类中的InitializeComponent。但不管怎样,它现在可以工作了。

我不知道你会怎么期望伪代码工作,因为没有任何东西在调用你的
初始化组件。通常,WPF在窗口的构造函数中代表您调用它。但在您的例子中,您正在添加一个新的实现(而不是覆盖),而没有任何东西调用它

一种选择是从每个子类构造函数调用新实现。例如,
AWindowImplementation
的构造函数可以调用
this.InitializeComponent()


另一个选项是
BaseWindow
定义其构造函数调用的虚拟方法(例如,
InitializeComponentCore
)。然后,基类可以重写该方法。

在WPF中,您可以创建一个基类,该基类继承自Windows,并具有XAML。但是有一个工作场所


请参阅此链接-

您需要将窗口的基类定义为自定义控件。只需创建一个新的自定义控件,将基类设置为Window,然后从blend插入样式(您可以添加组件)。另请参见pchajer的答案。

您说的是重写,您有抽象方法吗?没有,只有在抽象类中定义的字段,这些字段由自动生成的InitializeComponent Code在子类中再次定义。我的基类没有xaml,但每个实现都有。Thank将尝试链接的策略,如果成功,请返回并在子类构造函数中调用acceptInitializeComponent。这就是为什么我会收到“隐藏”的警告。如果伪代码不清楚,很抱歉。