最近在学习WPF,遇到一本入门好书,推荐给大家《Windows Presentation Foundation 4.5 Cookbook》

做项目首先要从MVVM开始,现在把他的Simple MVVM例子介绍给大家,感觉简单但很实用

1. App.xaml.cs中重载OnStartup

protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
var mainWindow = new MainWindow();
mainWindow.DataContext = new ImageData();
mainWindow.Show();
}

2. ViewModel的实现

 public  class ImageData:INotifyPropertyChanged
{
public ImageData()
{
_openImageFileCommand = new OpenImageFileCommand(this);
_zoomCommand = new ZoomCommand(this); }
public ICommand OpenImageFileCommand { get { return _openImageFileCommand; } }
public ICommand ZoomCommand { get { return _zoomCommand; } }
public string ImagePath
{
get { return _imagePath; }
set
{
_imagePath = value;
this.RaisePropertyChanged("ImagePath");
}
}
public double Zoom
{
get { return _zoom; }
set
{
_zoom = value;
this.RaisePropertyChanged("Zoom");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null)
return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
private double _zoom = 1.0;
private string _imagePath;
private OpenImageFileCommand _openImageFileCommand;
private ZoomCommand _zoomCommand;
}

3. 下面看看View是怎么做的,除了Xaml加绑定,不再需要其它多余的代码了。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CH07.RoutedCommands"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
x:Class="CH07.RoutedCommands.MainWindow"
d:DataContext="{d:DesignInstance Type=local:ImageData, IsDesignTimeCreatable=True}"
Title="Image Viewer" Height="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ToolBar FontSize="">
<Button Content="Open..." Command="{Binding OpenImageFileCommand}" Margin=""/>
<Button Content="Zoom In" Command="{Binding ZoomCommand}" CommandParameter="ZoomIn" Margin=""/>
<Button Content="Zoom Out" Command="{Binding ZoomCommand}" CommandParameter="ZoomOut" Margin=""/>
<Button Content="Normal" Command="{Binding ZoomCommand}" CommandParameter="ZoomNormal" Margin=""/>
</ToolBar>
<ScrollViewer Grid.Row="" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Image Source="{Binding ImagePath}" Stretch="None">
<Image.LayoutTransform>
<ScaleTransform ScaleX="{Binding Zoom}" ScaleY="{Binding Zoom}" />
</Image.LayoutTransform>
</Image>
</ScrollViewer>
</Grid>
</Window>

4. 还有ViewModel里的Command
ZoomCommand里的代码

   public class ZoomCommand:ICommand
{
public ZoomCommand(ImageData data)
{
_data = data;
}
public bool CanExecute(object parameter)
{
if (_data.ImagePath == null)
return false;
return _data.ImagePath.IsPicture();
} public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
private ImageData _data; public void Execute(object parameter)
{
var zoomType = (ZoomType)Enum.Parse(typeof(ZoomType), (string)parameter, true);
switch (zoomType)
{
case ZoomType.ZoomIn:
_data.Zoom *= 1.2;
break;
case ZoomType.ZoomOut:
_data.Zoom /= 1.2;
break;
case ZoomType.ZoomNormal:
_data.Zoom = 1.0;
break;
default:
break;
}
}
}
enum ZoomType
{
ZoomIn,
ZoomOut,
ZoomNormal
}

下面是OpenImageFileCommand

  public class OpenImageFileCommand:ICommand
{
public OpenImageFileCommand(ImageData data)
{
_data = data;
}
public bool CanExecute(object parameter)
{
return true;
} public event EventHandler CanExecuteChanged; private ImageData _data; public void Execute(object parameter)
{
var dlg = new OpenFileDialog
{
Filter = "图形 文件|*.jpg;*.png;*.bmp;*.gif"
}; if (dlg.ShowDialog()==true)
{
_data.ImagePath = dlg.FileName;
}
}
}

5. 其它
判断打开的文件类型

       public static bool IsPicture(this string filePath)
{
try
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fs);
string fileClass;
byte buffer;
byte[] b = new byte[];
buffer = reader.ReadByte();
b[] = buffer;
fileClass = buffer.ToString();
buffer = reader.ReadByte();
b[] = buffer;
fileClass += buffer.ToString(); reader.Close();
fs.Close();
////255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar
return ((fileClass == "" || fileClass == "" || fileClass == "" || fileClass == "") ? true : false); }
catch
{
return false;
}
}

实用的MVVM:ImageView的更多相关文章

  1. MVVM设计模式加RAC响应式编程

    一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都会被自己庞大的ViewController代码吓坏,不管是什么网络请求.networking data ...

  2. iOS架构:MVVM设计模式+RAC响应式编程

    https://cloud.tencent.com/developer/article/1117009 一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都 ...

  3. 跟我一起学extjs5(25--模块Form的自己定义的设计[3])

    跟我一起学extjs5(25--模块Form的自己定义的设计[3])         自己定义的Form已经能够执行了,以下改一下配置,把Form里面的FieldSet放在Tab之下.改动一下Modu ...

  4. 实用的圆形图片控件ImageView

    1.用法直接在布局中引用即可 import android.content.Context;import android.content.res.TypedArray;import android.g ...

  5. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  6. 【2016-10-24】【坚持学习】【Day11】【WPF】【MVVM】

    今天学习wpf的mvvm 人家说,APS.NET ===>MVC WPF===>MVVM 用WPF不用mvvm的话,不如用winform... 哈哈,题外话. 定义: MVVM: WPF的 ...

  7. WPF自定义控件与样式(14)-轻量MVVM模式实践

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非 ...

  8. Vue.js – 基于 MVVM 实现交互式的 Web 界面

    Vue.js 是用于构建交互式的 Web  界面的库.它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并 ...

  9. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

随机推荐

  1. 关于CUDA两种API:Runtime API 和 Driver API

                 CUDA 眼下有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围. 高级API(cuda_runtime.h)是一种C++ ...

  2. sql语言复习2

    一.查询 select 字段列表 from 表名列表 [where 条件表达式][group by 字段列表[having 条件表达式]] [order by 字段列表[asc|desc]] 含义:在 ...

  3. 【足迹C++primer】39、动态内存与智能指针(3)

    动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...

  4. C99_变长结构体实现

    /************************************************************************* > File Name: C99_lengt ...

  5. 使用Python与数据库交互

    # -*- coding: utf-8 -*- """ Created on Sun Nov 18 19:25:01 2018 @author: wangm " ...

  6. ios开发动物园管理 继承多态的实现

    // // main.m // 继承 // // #import <Foundation/Foundation.h> #import "Animal.h" #impor ...

  7. 九度OJ 1104:整除问题 (整除、因式分解)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4142 解决:1346 题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2< ...

  8. SE14 调整并激活数据库

    一.使用SE14 激活并调整MARA 时的消息:(体验心惊肉跳,你就改改标准表试试.-增强也请小心谨慎) 使用检查: 调整并激活后的结果: 二.如果 运行时对象检查 出错误,参考 http://blo ...

  9. Machine Learning in Action(0) 开篇

    现在貌似In Action很流行,各种技术抽象成工程商的Action,可以避开繁琐的内部原理,这本书从实践出发,通俗易懂的解释那些常用的机器学习算法,类似跟<集体智慧编程>.这本书中文出版 ...

  10. LVS集群中的IP负载均衡技术

    LVS集群中的IP负载均衡技术 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集 ...