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-继承泛型类的更多相关文章

  1. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  2. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  3. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  4. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  5. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  6. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  7. win10 uwp DataContext

    本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...

  8. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  9. Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽

    Win10 UWP版<芒果TV>直播超女,芒果台综艺一网打尽 Win10版UWP<芒果TV>自2015年9月登录商店以来,一直在持续更新,积极改进,拥有芒果台视频的独家点播和直 ...

  10. win10 UWP 动画

    原文:win10 UWP 动画 本文告诉大家如何写同一个简单的动画. 动画入门 本文开始写一个简单的动画,只是移动矩形作为本文的例子. 在 UWP 移动元素的动画,可以使用 RenderTransfo ...

随机推荐

  1. js中的如何定位固定层的位置

    需要获取一些HTML的对象的坐标来更灵活的设置目标层的坐标,这里可以通过用到document.body.scrollTop等属性,但是这些属性在xhtml的标准网页中或更简单的说就是带<!DOC ...

  2. ubuntu16.04上在使用搜狗输入法时,按shift不能正常切换中英文

    问题描述: ubuntu16.04上在使用搜狗输入法时,不知道把什么组合键给错按了,导致了按shift不能正常切换中英文,这是一件很烦恼的事儿! 解决步骤: 1,终端输入打开: fcitx-confi ...

  3. 说说a标签的onclick和href

    在平时我们一般会在列表中的最后一列给加上操作功能,一般的操作功能是修改和删除,这个操作我们可以通过a标签来实现其功能. <a class="pn-opt" href=&quo ...

  4. PHP 学习1.1

    1 链接mysql 数据简单测试 <html><head>  <title></title>  <meta http-equiv="Co ...

  5. 如何让div处于body居中的状态

    <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...

  6. LintCode_14 二分查找

    题目 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 [1 ...

  7. 【Vue】详解组件的基础与高级用法

    Vue.js 最核心的功能就是组件(Component),从组件的构建.注册到组件间通信,Vue 2.x 提供了更多方式,让我们更灵活地使用组件来实现不同需求. 一.构建组件 1.1 组件基础 一个组 ...

  8. 2018-12-29-WPF-如何建立自己的-3d-gis-程序

    title author date CreateTime categories WPF 如何建立自己的 3d gis 程序 lindexi 2018-12-29 14:11:11 +0800 2018 ...

  9. 使MySQL支持emoji

    1. 修改数据库的字符集 和 排序规则为: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode ...

  10. Leetcode706.Design HashMap设计哈希映射

    不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对.如果键对应的值已经存在,更新这个值. get(key ...