2009-10-29 35 views
1

我在WPF中的基類有問題。我嘗試使用一些基本元素來創建基類,以便其他窗口可以繼承這些組件。但是,我所擁有的,當我繼承基類只是空窗口,沒有這些元素。爲了更好地理解,我把我的代碼在這裏:在WPF中使用基類

using XSoftArt.WPFengine; 

namespace XSoftArt 
{ 

    public class WindowBase : Window 
    { 

    public WindowBase() 
    { 

    } 

}

的Windows代碼,whitch繼承WindowBase:

namespace XSoftArt.WPFengine 
{ 
    public partial class NewAbility : WindowBase 
    { 
     public NewAbility() 
     { 
      base.ChildForm = this; InitializeComponent(); 

     } 
    } 
} 

或者,也許有人可以把一個工作示例或鏈路與在wpf中實現基類? 謝謝

回答

0

我不認爲我會永遠在你試圖使用它的方式在WPF中使用繼承。

我會試着回答你的問題。如果我正確理解你,你正在嘗試這樣的事情:

  1. 你正在創建一個既有XAML文件又有代碼隱藏的窗口。
  2. 您將「基本元素」添加到您的窗口的XAML中......我不確定您的「基本元素」是什麼意思,但我會假設您的意思是您要添加UI元素你的窗戶。
  3. 您正在創建另一個窗口,從代碼隱藏的第一個窗口「派生」,問題是您沒有從「基本」窗口看到它的UI元素。

如果這就是你想用WPF完成的事情,那麼我個人建議不要這樣做,因爲我個人不是繼承的粉絲,並親眼目睹了讓繼承失控的危險。

您可以嘗試的是將您的「基本」UI元素組織到WPF UserControls中。 This tutorial也許能夠引導你朝着正確的方向前進。祝你好運!

+0

是什麼讓你說這是根本錯誤的,是不可能的?看起來像是一個飛躍,你不會說嗎? – 2009-10-29 17:03:43

+0

@安德森,好吧,這取決於我是否理解OP的問題。如果我這樣做了,而且他正在討論從XAML文件繼承XAML文件,只是繼承另一個控件的類,那麼不行,這是不可能的。 XAML不會那樣工作。如果我誤解了他,那麼也許有一種方法,但我認真地懷疑,根據OP如何描述它,在WPF中走這條路線是否明智。 – 2009-10-29 17:21:11

+0

雖然,也許我錯了。我編輯了我的答案,以反映這種情況。 – 2009-10-29 17:22:10

3

我不認爲你真的需要去做你正在做的事情,但是這是可行的。我想你只是忘記調用基類的構造函數。

using XSoftArt.WPFengine; 

namespace XSoftArt 
{ 

    public class WindowBase : Window 
    { 

     //call base ctor 
     public WindowBase() : base() 
     { 

     } 

    } 
} 

你需要從你的繼承類也這麼做:

namespace XSoftArt.WPFengine 
{ 
    public partial class NewAbility : WindowBase 
    { 
     public NewAbility() : base() 
     { 
      base.ChildForm = this; InitializeComponent(); 

     } 
    } 
} 

如果你也有一個XAML定義的視圖,你需要確保你的觀點是一個 WindowBase。要做到這一點,改變這種:

<Window x:Class="MyApp.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    ... 
    > 
    <Grid>   
    </Grid> 
</Window> 

要這樣:

<local:WindowBase x:Class="MyApp.MyView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:XSoftArt;" 
    ... 
    > 
    <Grid>   
    </Grid> 
</local:WindowBase> 

如果在反射看看這個類,你會看到,構造函數調用窗口類的自己的「初始化()」方法,其中設置了很多事情。具體來說,它似乎將自己掛鉤到分派器,這是所有UI事件的工作隊列。

+0

這個答案不是很有幫助。我在我的WindowBase中放置了一些UI元素。這些元素將在新窗口中繼承,並繼承WindowBase。我的其他窗口也有一些UI元素,但繼承像這樣,當我調用ShowDialog只有空窗口apears(WindowBase沒有元素,沒有NewAbility窗口的元素)。 – Vytas 2009-10-30 12:02:21

+0

你還有一個XAML代碼旁邊的文件嗎?如果是這樣,你需要確保你在文件中指定了正確的類型。我會在我的答案中更新這個。 – 2009-10-30 18:58:02

+0

您的答案是誤導性的,因爲在超類的無參數構造函數被調用時,基類的無參數構造函數會自動在C#中調用。 http://stackoverflow.com/questions/18097/in-c-do-you-need-to-call-the-base-constructor – jpierson 2010-05-17 02:28:37

1

尤其要確保調用基類的InitializeComponent()方法 - 這是創建您在XAML中定義的控件的函數。

如果您想繼承控件和行爲,但是考慮使用Templates來更靈活地管理一組通用控件,可以考慮使用派生類。

+1

我看了文檔的窗口,它似乎沒有一個InitializeComponent方法? http://msdn.microsoft.com/en-us/library/system.windows.window_methods.aspx我想你可能是從實際的視圖中引用InitializeComponent codegen'd方法。看來OP已經正確地做到了這一點。我同意在WPF上使用模板而不是控件,儘管......在那裏很好。 – 2009-10-29 17:14:26