实用的MVVM:ImageView
最近在学习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的更多相关文章
- MVVM设计模式加RAC响应式编程
一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都会被自己庞大的ViewController代码吓坏,不管是什么网络请求.networking data ...
- iOS架构:MVVM设计模式+RAC响应式编程
https://cloud.tencent.com/developer/article/1117009 一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼. 每次做完项目过后,都 ...
- 跟我一起学extjs5(25--模块Form的自己定义的设计[3])
跟我一起学extjs5(25--模块Form的自己定义的设计[3]) 自己定义的Form已经能够执行了,以下改一下配置,把Form里面的FieldSet放在Tab之下.改动一下Modu ...
- 实用的圆形图片控件ImageView
1.用法直接在布局中引用即可 import android.content.Context;import android.content.res.TypedArray;import android.g ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- 【2016-10-24】【坚持学习】【Day11】【WPF】【MVVM】
今天学习wpf的mvvm 人家说,APS.NET ===>MVC WPF===>MVVM 用WPF不用mvvm的话,不如用winform... 哈哈,题外话. 定义: MVVM: WPF的 ...
- WPF自定义控件与样式(14)-轻量MVVM模式实践
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. MVVM是WPF中一个非 ...
- Vue.js – 基于 MVVM 实现交互式的 Web 界面
Vue.js 是用于构建交互式的 Web 界面的库.它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并 ...
- 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)
上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...
随机推荐
- 在jsp中拿到applicationContext
WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...
- Linux 学习之虚拟机下的网络连接
参考资料: http://wenku.baidu.com/link?url=_55RWvvBKQDoZjQSo-HQ3TdmLIzX1zkA_g1znCw0IXkwvxbxMiA3KfpyaL-lhv ...
- javascript 高级编程系列 - 创建对象
1. 工厂模式 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age; obj.getName ...
- RabbitMQ安装和介绍
简单的安装方式 yum安装erlang,下载rpm包安装rabbitmq 一.编译安装erlang 1. 官方下载包并解压 wget http://erlang.org/download/otp_sr ...
- Python之Numpy库常用函数大全(含注释)
前言:最近学习Python,才发现原来python里的各种库才是大头! 于是乎找了学习资料对Numpy库常用的函数进行总结,并带了注释.在这里分享给大家,对于库的学习,还是用到时候再查,没必要死记硬背 ...
- openjdk源码目录结构
1 openjdk源码 http://hg.openjdk.java.net 选择jdk8u这个project, 然后选择jdk8u20这个repository. 2 目录结构 corba: comm ...
- Collection of Boot Sector Formats for ISO 9660 Images
http://bazaar.launchpad.net/~libburnia-team/libisofs/scdbackup/view/head:/doc/boot_sectors.txt Colle ...
- 使用 Visual Studio Code 运行 C# 及 Java 程序
背景 很多情况下,我只是想要编写一个非常简单的 C# 或者 Java 程序,只有几行代码,看看运行结果而已.虽说 Visual Studio / Eclipse / IntelliJ IDEA 功能强 ...
- HDOJ 4689 Derangement DP
DP具体解释见: http://blog.csdn.net/liguan1/article/details/10468139 Derangement Time Limit: 7000/7000 MS ...
- some base knowledge
har类型的长度被定义为一个8位字节,这很简单. short类型的长度至少为两字节.在有些计算机上,对于有些编译程序,short类型的长度可能为4字节,或者更长. int类型是一个整数的“自然”大小, ...