【问题标题】:Creating an abstract base class for windows in WPF在 WPF 中为窗口创建抽象基类
【发布时间】:2012-06-22 17:54:50
【问题描述】:

通常的 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)。不幸的是,控制字段没有被填充。

这可以实现吗?我要做的是创建几个具有相同界面/控件的 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。但无论如何,它现在可以工作了。

【问题讨论】:

  • 你说的是覆盖,你有抽象方法吗?
  • 不,只是抽象类中定义的字段在子类中由自动生成的 InitializeComponent 代码再次定义

标签: wpf user-interface wpf-controls


【解决方案1】:

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

参考这个链接 - How to create a common WPF base window style?

【讨论】:

  • 我的基类没有 xaml,但每个实现都有。谢谢将尝试链接的策略,如果有效,请返回并接受
【解决方案2】:

我不确定你会如何期望伪代码工作,因为没有任何东西调用你的InitializeComponent。通常,WPF 在窗口的构造函数中代表您调用它。但是在您的情况下,您正在添加一个新的实现(不是覆盖)并且没有调用它。

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

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

【讨论】:

  • InitializeComponent 已经在子类构造函数中被调用。这就是为什么我收到“隐藏”警告的原因。如果伪代码不清楚,请见谅。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 2013-05-14
    • 1970-01-01
    • 2011-06-30
    • 2012-05-11
    • 2010-10-10
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多