在WPF

2012-06-21 50 views
1
爲Windows創建一個抽象基類

平時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> 

以上是僞代碼。這個新的體系結構編譯,並警告實現隱藏控件定義(因爲我應該把'override'關鍵字放在自動生成的InitializeComponent的地方)。不幸的是,控制字段不會被填充。

這是可以實現的嗎?我正在嘗試的是使用相同的界面/控件創建多個UI設計,以便其餘代碼可以與任一設計進行交互。

編輯:感謝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

不,只是在抽象類中定義的字段是由子類中的自動生成的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,然後從混合中插入樣式(您可以添加您的組件)。另請參閱pchajer的回答。