2018-2-13-win10-uwp-如何让-Page-继承泛型类
| 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);
}
2018-2-13-win10-uwp-如何让-Page-继承泛型类的更多相关文章
- win10 uwp 使用 Microsoft.Graph 发送邮件
在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...
- 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用
协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...
- win10 uwp 列表模板选择器
本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...
- win10 uwp MVVM 轻量框架
如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...
- win10 uwp DataContext
本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...
- win10 uwp 商业游戏 1.2.1
上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...
- Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽
Win10 UWP版<芒果TV>直播超女,芒果台综艺一网打尽 Win10版UWP<芒果TV>自2015年9月登录商店以来,一直在持续更新,积极改进,拥有芒果台视频的独家点播和直 ...
- win10 UWP 动画
原文:win10 UWP 动画 本文告诉大家如何写同一个简单的动画. 动画入门 本文开始写一个简单的动画,只是移动矩形作为本文的例子. 在 UWP 移动元素的动画,可以使用 RenderTransfo ...
随机推荐
- 【模板】 递归线段树 [2017年五月计划 清北学堂51精英班Day4]
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- js实现HashTable
1.哈希表使用键值对进行的数据储存,在数据的存储位置和它的关键字之间建立一一对应的关系,从而使关键字和结构中的一个唯一的存储位置相对应,所以在检索数据时 只需要根据这个关系便可以快速定位到要找的数据. ...
- Hadoop 无法启动的问题
最近乱搞把本来就快要挂了的hdfs又给弄坏了.问题如下, 应该是节点没有启动. [hadoop@namenode hadoop]$ hadoop dfsadmin -report Configured ...
- 介绍Provide以及Inject
介绍 Vue 的 Provide 以及 Inject Provide 以及 Inject 是 Vue 中用于祖先元素向其所有后台元素注入依赖的接口. 具体用法 // Data.vue ... expo ...
- 使用Redis管道提升性能
首发于 樊浩柏科学院 Redis 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间.在一些批量操作数据的场景,使用管道可以显著提升 Redis ...
- MaxCompute技术人背后的故事:从ApacheORC到AliORC
2019大数据技术公开课第一季<技术人生专访>来袭,本季将带领开发者们探讨大数据技术,分享不同国家的工作体验.本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访,将为大家介绍Apach ...
- 洛谷2501 BZOJ1801中国象棋题解
题目链接 BZ链接 其实dp只要把状态想好后转移就很好写了(flag*1) f[i][j][k]表示到了第i行,有j列放了一个跑,有k列放了两个跑的方案总数 然后大力讨论,转移即可 # include ...
- Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题
1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果.也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdo ...
- QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法
前言 在阿里七层流量入口接入层(Application Gateway)场景下, Nginx 官方的Smooth Weighted Round-Robin( SWRR )负载均衡算法已经无法再完美施展 ...
- openjudge dp水题记录
当发现自己竟然不会打dp的时候内心是崩溃的,然后按照一年前的刷题记录刷openjudge,然后发现自己准确率比一年前(刚学信竞两个月时)的准确率低得多,已经没救. 列一下最近打的几道sb题 2985: ...