通常的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>
以上是伪代码。这个新架构编译,警告实现隐藏控件定义(因为我应该把'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>
我想我必须在基类中使用不同的字段名来消除警告,或者可能删除派生类中的InitializeComponent。但无论如何它现在有效。
答案 0 :(得分:2)
在WPF中,您可以创建一个继承自Window并具有XAML的Base类。但是有一个工作场所
答案 1 :(得分:0)
我不确定你会如何期望伪代码能够正常工作,因为没有任何东西可以调用你的InitializeComponent
。通常,WPF会代表您在窗口的构造函数中调用它。但在你的情况下,你正在添加一个新的实现(而不是覆盖),没有任何东西在调用它。
一种选择是从每个子类构造函数中调用新的实现。例如。 AWindowImplementation
的构造函数可以调用this.InitializeComponent()
。
另一个选项是BaseWindow
定义构造函数调用的虚方法(比如InitializeComponentCore
)。然后基类可以覆盖该方法。
答案 2 :(得分:0)
您需要将Window的基类定义为自定义控件。只需创建一个新的自定义控件,将基类设置为Window,然后从blend中插入样式(您可以添加自己的组件)。另见pchajer的回答。