title author date CreateTime categories
win10 uwp 如何让 Page 继承泛型类
lindexi
2018-2-13 17:23:3 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家一个方法让 Page 继承一个泛型类。
我使用自己的框架的时候,发现每个页面都需要添加一些相同的代码,所以就想把他写出来,作为一个基础的 Page 。
这个 Page 需要指定自己的 ViewModel 但是这个 ViewModel 却是每个 Page 不相同,所以一个好的方法是指定他的泛型类。但是这时如果使用 Page 继承,就会出现编译错误。

因为需要使用下面的代码才可以从页面拿到传入的 ViewModel ,所以所有的页面都添加相同的代码,在软件上是比较差的

    public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
} public ViewModel ViewModel { set; get; } protected override void OnNavigatedTo(NavigationEventArgs e)
{
ViewModel = (ViewModel) e.Parameter;
DataContext = ViewModel;
base.OnNavigatedTo(e);
}
}

如果可以使用泛型,那么代码会简单很多

首先写出一个基础类 DslujbefGgtvl 这个类继承 Page ,于是就可以把所有 Page 需要写的代码只写一次

    public class DslujbefGgtvl<T> : Page where T: IViewModel
{
public T ViewModel { set; get; } protected override void OnNavigatedTo(NavigationEventArgs e)
{
ViewModel = (T) e.Parameter;
DataContext = ViewModel;
base.OnNavigatedTo(e);
}
}

这样 Page 继承 DslujbefGgtvl 就需要告诉他现在需要哪个 ViewModel 不需要其他的代码

    public sealed partial class MainPage : DslujbefGgtvl<ViewModel>
{
public MainPage()
{
this.InitializeComponent();
}
}

但是这时会出现错误Error CS0263: “MainPage”的分部声明一定不能指定不同的基类 (23, 33) 这是因为 xaml 没有继承 DslujbefGgtvl

打开 xaml 把 Page 替换为 DslujbefGgtvl 然后添加 TypeArguments

<local:DslujbefGgtvl
x:TypeArguments="local:ViewModel" x:Class="TwipmeHpka.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TwipmeHpka"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> </Grid>
</local:DslujbefGgtvl>

这时编译出现 Error CS0305: 使用泛型 类型“DslujbefGgtvl”需要 1 个类型参数 (1, 1) ,所以看起来 Page 无法继承 泛型类

一个解决方法是写另一个类去继承,下面我写 RavthuVythrbe 继承 DslujbefGgtvl 这样就可以使用

   public sealed partial class MainPage : RavthuVythrbe
{
public MainPage()
{
this.InitializeComponent();
}
} public class RavthuVythrbe : DslujbefGgtvl<ViewModel>
{ } public class DslujbefGgtvl<T> : Page where T: IViewModel
{
public T ViewModel { set; get; } protected override void OnNavigatedTo(NavigationEventArgs e)
{
ViewModel = (T) e.Parameter;
DataContext = ViewModel;
base.OnNavigatedTo(e);
}
}
<local:RavthuVythrbe
x:Class="TwipmeHpka.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TwipmeHpka"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> </Grid>
</local:RavthuVythrbe>

所以需要添加一个类来继承泛型的才可以被Page继承。

这个方法需要添加一个类,但是还有另一个方法可以写在框架,需要把 xaml 继承 Page 修改为 IPage

    public sealed partial class MainPage : DslujbefGgtvl<ViewModel>, IPage

    public interface IPage
{
UIElement Content { get; set; }
}
<local:IPage
x:Class="TwipmeHpka.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TwipmeHpka"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <local:IPage.Content>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Margin="10,10,10,10" Text="lindexi"></TextBlock>
</Grid>
</local:IPage.Content> </local:IPage>

所以 page 不可以继承泛型,但是可以继承接口,所以在框架可以使用这个方法让 Page 继承一个泛型的类,这样可以减少代码

实际使用的 IPage 的代码

   public interface IPage: IFrameworkElement
{
UIElement Content { get; set; }
Frame Frame { get; }
NavigationCacheMode NavigationCacheMode { get; set; }
AppBar TopAppBar { get; set; }
AppBar BottomAppBar { get; set; }
} public interface IFrameworkElement
{
TriggerCollection Triggers { get; }
ResourceDictionary Resources { get; set; }
object Tag { get; set; }
string Language { get; set; }
double ActualWidth { get; }
double ActualHeight { get; }
double Width { get; set; }
double Height { get; set; }
double MinWidth { get; set; }
double MaxWidth { get; set; }
double MinHeight { get; set; }
double MaxHeight { get; set; }
HorizontalAlignment HorizontalAlignment { get; set; }
VerticalAlignment VerticalAlignment { get; set; }
Thickness Margin { get; set; }
string Name { get; set; }
Uri BaseUri { get; }
object DataContext { get; set; }
Style Style { get; set; }
DependencyObject Parent { get; }
FlowDirection FlowDirection { get; set; }
event RoutedEventHandler Loaded;
event RoutedEventHandler Unloaded;
event SizeChangedEventHandler SizeChanged;
event EventHandler<object> LayoutUpdated;
object FindName(string name);
void SetBinding(DependencyProperty dp, BindingBase binding);
}

最新文章

  1. Webform(六)——登录状态保持(Cookies内置对象)
  2. SSIS 项目部署模型
  3. 基于DevExpress开发的GridView如何实现一列显示不同的控件类型
  4. Wordpress更改后台地址
  5. iOS &#160;Emoji表情编码/解码
  6. 类模板的困扰 LNK2019 (转)
  7. C语言快排
  8. QM课程02-外部功能
  9. 库函数 Math
  10. Javascript进阶篇——( JavaScript内置对象---上-Date,string,charAt,indexOf,split,substring,substr)笔记整理
  11. c/c++测试函数的运行时间(八种方法)
  12. C#用panel实现子窗体的切换
  13. [四] JavaIO之类层次体系结构横向比对
  14. 6101 最优贸易 (双向spfa)
  15. ArrayList 实现随机点名
  16. Mysql 5.7 CentOS 7 安装MHA
  17. 不合法的DB Index
  18. QML类型说明-ParallelAnimation
  19. 软工1816&#183;Alpha冲刺(10/10)
  20. WebHDFS vs HttpFS GateWay

热门文章

  1. 集训队日常训练20180513-DIV2
  2. 启动Hadoop时,DataNode启动后一会儿自动消失的解决方法
  3. PHP 学习1.4
  4. LintCode_173 链表插入排序
  5. JSP页面中验证码的调用方法
  6. Congratulation!顺利通过-2019年6月份的PMP考试
  7. Hibernate的映射机制是怎样?
  8. small标签
  9. js将canvas保存成图片并下载
  10. install4j的使用