在Silverlight中有些專案對UserControl重新做了封裝基類,如PageBase,要求專案中每個頁面都要從PageBase派生,但是過程比較坎坷,本文針對這個功能點的實現以及實現過程中遇到的一些問題作了一個簡要的解答。
一般看到的PageBase類如下所示:
public class PageBase : UserControl { //這裡進行一些其他的封裝操作 } |
然後在具體的介面後臺類中改變父類:
public partial class MainPage : PageBase { public MainPage() { InitializeComponent(); } } |
然後編譯,這時編譯器會提示一個錯誤:
"SilverlightPageBase.MainPage"的分部宣告一定不能指定不同的基類 |
Error message in English
"SilverlightPageBase.MainPage"must not specify different base classes |
原因是XAML介面和後臺引用不一致造成,解決辦法:
將XAML第一行改為:
<UserControl x:Class="SilverlightPageBase.PageBase" ... |
再次編譯又會提示新的錯誤:
"SilverlightPageBase.PageBase"的宣告上缺少 partial 修飾符;存在此型別的其他分部宣告 |
Error message in English
Missing partial modifier on declaration of type"SilverlightPageBase.PageBase";another partial declaration of this type exists |
這時只需要在基類上加修飾符partial即可:
x:Class 屬性 配置 XAML 編譯,在標記和程式碼隱藏之間連線分部類。程式碼分部類在一個獨立的程式碼檔案中定義,標記分部類由程式碼生成過程在 XAML 編譯期間建立。 //這樣意思是前臺和基類(父類)成為部分類的兩個檔案,而真正的後臺類成為普通類 |
結果如:
public partial class PageBase : UserControl { //這裡進行一些其他的封裝操作 } |
如果想要實現一些介面的話,直接在基類中實現即可:
public partial class Class1 : UserControl,IDisposable { public void Dispose() { throw new NotImplementedException(); } } |
完整程式碼如:
XAML檔案:
<UserControl x:Class="SilverlightPageBase.PageBase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> </Grid> </UserControl> |
XAML對應後臺檔案:(其實這裡的partial已經沒有存在的必要了)
namespace SilverlightPageBase { public partial class MainPage : PageBase { public MainPage() { InitializeComponent(); } } } |
基類PageBase檔案:
namespace SilverlightPageBase { public partial class PageBase : UserControl { //這裡進行一些其他的封裝操作 } } |
結論:前臺是沒辦法繼承的,要想實現繼承只有將他提升為父類的部分類,讓原有後臺類繼承他,這樣可以保證原有功能的情況下實現擴充套件。