一、关于WPF

WPF(Windows  Presentation Foundation) ,从名字来看,Microsoft想把WPF技术作为Windows程序外观(表现层)的基础。我们知道,现在开发一套系统,一般都会采用分层架构,最基本的层次会包含表现层,逻辑层,和数据层,总之如果是GUI程序,就需要有表现层。WPF技术就是用来实现表现层的技术,在实际开发中就是做界面,做UI,它可以让界面做的非常酷,而且实现这些酷的效果并不太费力。另外是WindowsCommunication Foundation及 Windows Workflow Foundation。

一句话总结:WPF是在Windows平台上用来开发GUI程序的表现层的技术

二、GUI开发的历史

1、WindowsAPI + C语言

最早的开发WindowsGUI程序的思路。用C语言直接调用Windows操作系统提供的API函数来开发,程序员处理Windows消息。经历过这段开发时期的程序员一般对底层比较清楚,要了解Windows操作系统的工作原理。

2、MFC +C++

MicrosoftFoundation Class(MFC),微软用C++封装了Win32 API, C++程序员通过使用MFC类库来开发。面向对象的编程方法。

3、WinForm+ C#

微软推出.net平台后,Winform程序是.net平台中的技术,它把WinAPI封装成了控件。

4、WPF +C#

当然也是基于.net平台的技术,从.netframwork3.0开始推出WPF技术。WPF的特点是数据驱动,而以上三者是消息驱动或事件驱动的开发模式。从图像系统角度看,WPF对图形的展示是直接使用directX技术,而其他三者是基于GDI/GDI+技术,因此WPF在图形图像处理方面很优越,提高了用户体验。

其他还有一些VB+ActiveX控件,JavaSwing,Delphi等开发模式,这些不太熟悉,就不多说了。

我们知道,目前的应用程序很注重用户体验,而且程序的规模也越来越大,上述的技术演变刚好可以看出这点,从面向过程编程方法演变到面向对象方法,再演变到组件化方法,这都是为了提供开发效率,而WPF的出现,使应用程序在用户体验上,界面的展现效果更佳。

三、WPF的优缺点

从2007年开始WPF作为.netframework3.0中的一项重要技术发布,版本号也跟随.netframework叫WPF3.0,随后发布了WPF3.5,WPF3.5SP1,WPF4.0,WPF4.5。随着版本的不断更新,WPF的能力也越来越强,其应用也越来越多。开发微软最新推出的平台应用,如: windows8, surface,windows phone8等程序,基本都要用到WPF技术。

其优缺点:

优点:

1、使用DirectX技术,图形图像处理能力强。相对于Winform或更早的技术,WPF实现的界面效果优越很多。

2、代码后置(Code-Behind)更彻底,设计师可以用Xaml语言来设计UI,同时程序员可以开发后台交互逻辑,最后很容易集成到一起,如果需要更换界面,更换Xaml文件的设计即可。相比于之前的Winform程序,在开发流程上一定的并行化,换肤更简单。不过目前看来Blend比不上PhotoShop。所以很多设计师还是用Photoshop来实现效果图。而程序员要想做好WPF程序,也需要学习好Xaml,实现界面效果。

3、最重要的一点是,WPF是数据驱动UI的模式,相比Winform或之前的技术,它们都是通过UI来驱动数据的改变。数据驱动UI也就是说,UI控件的样子不是固定的,UI控件只是对数据的展示,而以什么样的形态来展示给用户,完全取决于控件的模板和样式,也就是说按钮不一定是一个矩形的,你可以让它变成圆形。随着学习,慢慢会体会到WPF的强大。

缺点:性能不好,对硬件要求高。

四、关于MVVM

WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。

我们使用模式,一般是想达到高内聚低耦合。在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过数据绑定来更新UI;在响应用户操作上,WinForm是通过控件的事件来处理,而WPF可以使用命令绑定的方式来处理,耦合度将降低。

我们可以通过下图来直观的理解MVVM模式:

View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户。

ViewModel,一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。

Model,就是系统中的对象,可包含属性和行为。

一般,View对应一个ViewModel,ViewModel可以聚合N个Model,ViewModel可以对应多个View,Model不知道View和ViewModel的存在。

五、MVVM的简单案例

框架视图:

各个文件源码:

MainWindow.cs:

namespace WpfMvvm
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
}

Model.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.ComponentModel;
using System.Windows.Input; namespace WpfMvvm
{
class Model:NotificationObject
{
private string _wpf = "WPF"; public string WPF
{
get { return _wpf; }
set { _wpf = value; this.RaisePropertyChanged("WPF"); }
}
public void Copy(object obj)
{
this.WPF += "WPF";
} }
}

Notification.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel; namespace WpfMvvm
{
class NotificationObject:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}

ViewModel.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WpfMvvm
{
class ViewModel
{
public DelegateCommand CopyCmd { get; set; }
public Model model { get; set; } public ViewModel()
{
this.model = new Model();
this.CopyCmd = new DelegateCommand();
this.CopyCmd.ExecuteCommand = new Action<object>(this.model.Copy);
}
}
}

DelegateCommand.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Windows.Input; namespace WpfMvvm
{
class DelegateCommand:ICommand
{
public Action<object> ExecuteCommand = null;
public Func<object, bool> CanExecuteCommand = null;
public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter)
{
if (CanExecuteCommand != null)
{
return this.CanExecuteCommand(parameter);
}
else return true;
} public void Execute(object parameter)
{
if (this.ExecuteCommand != null)
{
this.ExecuteCommand(parameter);
}
} public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}

WPF的MVVM的更多相关文章

  1. WPF 微信 MVVM 【续】修复部分用户无法获取列表

    看过我WPF 微信 MVVM这篇文章的朋友,应该知道我里面提到了我有一个小号是无法获取列表的,始终也没找到原因. 前两天经过GitHub上h4dex大神的指导,知道了原因,是因为微信在登录以后,web ...

  2. WPF 微信 MVVM 【续】发送部分QQ表情

    今天主要记录的就是发送QQ表情, WPF 微信 MVVM里写了,后期为了发送QQ表情,需要把TextBox替换为RichTextBox,接下来就说说替换的过程. 一.支持Binding的RichTex ...

  3. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  4. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

  5. WPF Prism MVVM 中 弹出新窗体. 放入用户控件

    原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...

  6. WPF之MVVM模式(3)

    有种想写一个MVVM框架的冲动!!! 1.Model中的属性应不应该支持OnPropertyChanged事件? 不应该.应该有ViewModel对该属性进行封装,由ViewModel提供OnProp ...

  7. 在WPF的MVVM框架中获取下拉选择列表中的选中项

    文章概述: 本演示介绍怎样在WPF的MVVM框架中.通过数据绑定的方式获取下拉列表中的选中项.程序执行后的效果例如以下图所看到的: 相关下载(代码.屏幕录像):http://pan.baidu.com ...

  8. 【WPF】MVVM模式的3种command

    原文:[WPF]MVVM模式的3种command 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL, ...

  9. 查杀进程小工具——WPF和MVVM初体验

    最近因为工作需要,研究了一下桌面应用程序.在winform.WPF.Electron等几种技术里,最终选择了WPF作为最后的选型.WPF最吸引我的地方,就是MVVM模式了.MVVM模式完全把界面和业务 ...

  10. WPF和MVVM的结合使用方法,不可错过

    Model:存储数据模型(类) 也在此业务逻辑,主要负责类文件的存储. ViewModel:连接View和Model,借助Command来负责界面的跳转和调用Model中方法来操作Model的数据. ...

随机推荐

  1. [Swust OJ 1026]--Egg pain's hzf

      题目链接:http://acm.swust.edu.cn/problem/1026/     Time limit(ms): 3000 Memory limit(kb): 65535   hzf ...

  2. ThinkPHP-3.2.3学习

    一.下载安装 核心包:不用解释,最减版本 完整包:包括扩展功能(验证码.session等) 二.调试 ----www ---thinkphp_3 Application                 ...

  3. validform 一行代码完成所有验证

    validform一行代码完成所有验证 在使用的时候想更改提示效果为右侧提示却一直不能成功 tiptype可以为1.2 和 自定义函数.2 表示右侧提示. 注意:tiptype为 2 时,各表单元素对 ...

  4. linux ubuntu安装jdk

    Oracle对Jdk7与Jre7的关系的经典图解 Oracle has two products that implement Java Platform Standard Edition(Java ...

  5. SUP (SAP Mobile SDK 2.2) 连接 Sybase SQL Anywhere sample 数据库

    安装了   SAP Mobile SDK 2.2   后发现,这个版本没有自带Sybase SQL Anywhere  数据库. 解决办法: 1. 免费下载 SQL Anywhere Develope ...

  6. java里,当long与上了int

    long switchState = 0xf0000000000L; int result = (switchState & 0xff00000000L) > 0 ? 0x01 : 0x ...

  7. eclipse上 安装php插件

    首先在安装之前需要有eclipse   以及SDK环境已经搭建好 eclipse开发工具下载路径: http://dl.oschina.net/soft/eclipse java sdk下载路径: h ...

  8. 在windows下安装mysql5.6.24版本

    链接地址:http://jingyan.baidu.com/article/90bc8fc8615c99f653640cc4.html 工具/原料 官网下载安装包 系统需装net 4.0及以上运行库 ...

  9. android4.0移植,拨号异常

    D/dalvikvm( 2274): GC_CONCURRENT freed 206K, 12% free 6571K/7431K, paused 2ms+3ms D/dalvikvm( 2274): ...

  10. asp.net core 使用 Redis 和 Protobuf

    asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介 ...