在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 { //这里进行一些其他的封装操作 } } |
结论:前台是没办法继承的,要想实现继承只有将他提升为父类的部分类,让原有后台类继承他,这样可以保证原有功能的情况下实现扩展。