最近学习MVVM,至于什么是MVVM我也在这儿不多说了,一是关于它的解释解释网上非常多,二是我怕自己讲不清,误导自己没关系,误导别人就不好了。。

好了,废话结束,看是实战......

这个必应壁纸的demo非常简单,只有一个页面,上面有一个Image,一个TextBox和两个Button控件。

如下图所示

那么下面吧XAML代码贴上来

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Image Source="{Binding ImageSource}"></Image>
<TextBox Grid.Row="1" Text="{Binding Copyright}" IsReadOnly="True"></TextBox>
<Grid HorizontalAlignment="Stretch" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Content="上一张" Command="{Binding ButtonCommand}" CommandParameter="上一张" HorizontalAlignment="Center" Grid.Column="0"></Button>
<Button Content="下一张" Command="{Binding ButtonCommand}" CommandParameter="下一张" HorizontalAlignment="Center" Grid.Column="1"></Button>
</Grid>
</Grid>
</Grid>

在设计的时候,我是先设计的ViewModel,但是由于设计ViewModel的时候我已经知道必应壁纸的请求参数。

http://cn.bing.com/HPImageArchive.aspx?format=js&idx=idx=0&n=1

有三个查询参数

  format:这个应该是指定返回数据类型,默认设成js不变

  idx:如果你想获取昨天的壁纸,那么这个参数就是1,如果是获取前天的壁纸,那么这个就是2,经过我测试,他的取值范围是[-1,15],比较有意思的是,-1应该就是明天的壁纸吧,嘿嘿

  n:表示返回数据中包含几组图片信息,我设为1

由于我设置的返回格式是json,json的解析我就不贴了,放在demo中,咋们的重点也不是这个。

为了在下面的ViewModel中不出现混乱,我先给出Model的定义。

namespace 必应壁纸实战.Model
{
public class BingImageModel
{public string copyright { get; set; }//返回图片的copyright
public Uri uri { get; set; } //返回具体图片的uri
public int idx { get; set; } = ;
public int n { get; set; } = ;
}
}

ViewModel的设计是我结合了View中的需求设计的。

namespace 必应壁纸实战.ViewModle
{
public class BingImageViewModel: ViewModelBase
{
private string _copyright;
public string Copyright
{
get
{
return _copyright;
} set
{
_copyright = value;
OnPropertyChanged();
}
} private BitmapImage _imageSource;
public BitmapImage ImageSource
{
get
{
return _imageSource;
} set
{
_imageSource = value;
OnPropertyChanged();
}
} private int index;
public int Index
{
get
{
return index;
} set
{
if (value <= )
value = ;
index = value;
IndexChanged();
}
} public RelayCommand ButtonCommand { get; set; } public BingImageModel Model { get; set; } private void ButtonDown(object param)
{
string tag = param as string;
if (tag != null)
{
if (tag == "上一张")
{
Index++;
}
else
{
Index--;
}
}
} public BingImageViewModel()
{
Model = new BingImageModel(); ButtonCommand = new RelayCommand();
ButtonCommand.ExcuteParam = ButtonDown; Index = ;
Copyright = "";
} private async void IndexChanged()
{
Model = await HttpService.GetBingImageModel(Index);
if (Model != null)
{
ImageSource = await HttpService.GetBingImage(Model);
Copyright = Model.copyright;
}
}
}
}

ViewModel

我对ViewModel做一个简单说明

ImageSource和Image空间的Source属性绑定

Copyright和TextBox的Text属性绑定

ButtonCommand和两个Button的Command属性绑定,并且通过CommandParameter来区别执行的命令

Index对应请求参数idx,在它的值改变后执行IndexChanged来获取必应壁纸

ButtonDown方法对应ButtonCommand来实现对Index的修改,自增代表前一天,自减代表后一天

Model封装了获取壁纸的一些必要信息,结合Service中定义的HttpClinet的helper来实现具体的网络数据请求。

此外,作为WVVM的必备模式,ViewModel是继承自ViewModelBase的,用以实现绑定机制。

完成View,ViewModel,和Model后,一定不要忘记在View中对ViewModel的绑定,最简单就是类似于“this.DataContext=new ViewModel();”了。

到这儿就基本完成了,但感觉写的有些混乱,我把整个过程中的几个坑在这儿说说

1.就是关于WVVM,一直没有弄明白在ViewModel中写大量的代码究竟好不好,我还有待研究;

2.用Windows.Web.Http命名空间定义的HttpClient请求图片数据后,用如下方式实现对一个BitmapImage对象的设置

  

            BitmapImage bitMap = new BitmapImage(); ;
var response=await HttpClient.GetAsync(model.uri);
var buffer = await response.Content.ReadAsBufferAsync(); byte[] bytes = new byte[buffer.Length];
buffer.CopyTo(bytes); //CopyTo是一个定义在System.Runtime.InteropServices.WindowsRuntime;的对IBuffer的拓展方法,这个一定注意
using (MemoryStream memoryStream = new MemoryStream(bytes))
{
var randomstream = memoryStream.AsRandomAccessStream();
await bitMap.SetSourceAsync(randomstream);
}

好了,上demo代码,点击“我是代码”下载

[uwp]MVVM模式实战之必应壁纸查看器的更多相关文章

  1. angular 实战系列 之 mvvm模式

    什么是MVVM模式 mvvm模式是mvc模式的一种变体,其中第一个m表示model,可以认为是数据对象的抽象,v代表view,vm代表view model ,是对view中的数据抽象(注1).mvvm ...

  2. WPF实战案例-MVVM模式下在Xaml中弹出窗体

    相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...

  3. mvc和mvvm模式

    一. Mvvm定义 MVVM是Model-View-ViewModel的简写.即模型-视图-视图模型.[模型]指的是后端传递的数据.[视图]指的是所看到的页面.[视图模型]mvvm模式的核心,它是连接 ...

  4. 使用Qt实现一个必应壁纸客户端

    概要 必应的每日壁纸很好看,但是看不到一周以前的壁纸图片,日前使用python开发了必应壁纸收集站,可惜这样的收集站只能在线浏览,我在想要是有一款软件能够下载每日必应壁纸,并应用到windows的桌面 ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  7. silverlighter下MVVM模式中利用Behavior和TargetedTriggerAction实现文本框的一些特效

    在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Butt ...

  8. win10 uwp MVVM 轻量框架

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

  9. MVVM模式用依赖注入的方式配置ViewModel并注册消息

    最初的想法 这次主要讨论下给View指定ViewModel的事情.一般来说给View指定ViewModel常用的方式有两种,一种是在View的后台代码中写DataContext = new ViewM ...

随机推荐

  1. Telnet命令相关+DMZ主机+花生壳

    Win7如何解决telnet不是内部或外部命令的方案! telnet用法 测试端口号

  2. Hadoop详细安装配置过程

    步骤一:基础环境搭建 1.下载并安装ubuntukylin-15.10-desktop-amd64.iso 2.安装ssh sudo apt-get install openssh-server op ...

  3. [Delphi] FMXUI - 沉侵式状态栏

    好消息!FMXUI正式支持Android和IOS的沉侵式状态栏了. 先来看看效果图 安卓: IOS: 一.Android 沉侵式状态栏 FMXUI的沉侵式状态栏支持SDK版本大于21的Android系 ...

  4. 跟我学算法-吴恩达老师(mini-batchsize,指数加权平均,Momentum 梯度下降法,RMS prop, Adam 优化算法, Learning rate decay)

    1.mini-batch size 表示每次都只筛选一部分作为训练的样本,进行训练,遍历一次样本的次数为(样本数/单次样本数目) 当mini-batch size 的数量通常介于1,m 之间    当 ...

  5. servlet访问路径的写法

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  6. maven使用阿里云maven库

    在maven\conf\settings.xml中的mirrors添加 <mirror> <id>nexus-aliyun</id> <name>Nex ...

  7. spring security+cas(cas proxy配置)

    什么时候会用到代理proxy模式? 举一个例子:有两个应用App1和App2,它们都是受Cas服务器保护的,即请求它们时都需要通过Cas 服务器的认证.现在需要在App1中通过Http请求访问App2 ...

  8. 值类型 struct

    由于值类型存在装箱和拆箱的过程,所有导致在修改值类型对象内部数据时,有可能会出现一些与预想不同的结果. 比如 Point p = , ); Console.WriteLine(p); p.Change ...

  9. C# 将Word,Execl,PPT,Project, 文件转成PDF, 不依赖Office!!

    git 地址 https://gitee.com/bandung/Execl_WordTOPDF.git 包括了各种破解的dll Word转PDF 挨个引用 Word转PDF public void ...

  10. python virtualenv环境安装(ubuntu)

    测试系统ubantu16.04 该系统已经默认安装了python3.5, 当然了python2.7也同时存在着. 可以用如下命令安装pip(如下命令会默认安装pip到python2.7库中) $ su ...