最近在学习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. visual c++ 2013进行MySQL编程(ODBC) -- (一) 套装安装

    最近写了有些技术类文章了,只因为最近研究多了些东西,有一些项目用到了,所以自己记录一下,怕自己忘记,如果有哪位同学有自己的见解,可以邮件或者回复,技术类的探讨,不管对否,都是欢迎的. 操作之前,必须安 ...

  2. PHP网站http替换https

      PHP网站http替换https

  3. Java集合01----ArrayList的遍历方式及应用

                                                 Java集合01----ArrayList的遍历方式及应用 前面已经学习了ArrayList的源代码,为了学以 ...

  4. DDR硬件设计要点详解(包括电源部分)

    转自 http://www.fairchildic.org/module/forum/thread-658-1-1.html (原帖包括详细的附件内容) 1. 电源 DDR的电源可以分为三类A.主电源 ...

  5. kubernetes之故障排查和节点维护(二)

    系列目录 案例现场: 测试环境集群本来正常,突然间歇性地出现服务不能正常访问,过一会儿刷新页面又可以正常访问了.进入到服务所在的pod查看输出日志并没有发现异常.使用kubectl get node命 ...

  6. kubernetes故障现场一之Orphaned pod

    系列目录 问题描述:周五写字楼整体停电,周一再来的时候发现很多pod的状态都是Terminating,经排查是因为测试环境kubernetes集群中的有些节点是PC机,停电后需要手动开机才能起来.起来 ...

  7. PythonCookBook笔记——字符串和文本

    字符串和文本 使用多个分隔符分割字串 使用正则re.split()方法. >>> line = 'asdf fjdk; afed, fjek,asdf, foo' >>& ...

  8. 在VS2015中增加JQuery引用及智能提示

      打开VS2015,从"工具"菜单选择NuGet选项,搜索Jquery,并点击安装.   可以看到解决方案的scripts增加了对应文件的引用   在HTML文件中可以直接引用j ...

  9. 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP

    [BZOJ3566][SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线 ...

  10. 基本动画、复合动画设置 平移、缩放、旋转、透明度 编码实现 xml实现

    public class VAActivity extends Activity { private ImageView iv_animation; private TextView tv_anima ...