最近比较关注MVVM(Model-View_ViewModel)模式,该模式十分适合WPF/Silverlight的开发。出于练习的目的打算使用Silverlight做个英汉词典(可能是由于近来疯狂的听VOA的缘故),下面针对该项目进行简单的分析。
注:由于Silverlight不支持Command 所以并无法像WPF那样完全实现MVVM模式。

老规矩,先看下运行时的截图

这里说下我的开发环境

windows server 2008
visual studio 2008 with sp1
sliverlight 2

下面开始一步一步的制作该应用。

首先新建一个Silverlight项目并宿主在ASP.NET Web Application中(当然我强烈建议宿主在ASP.NET MVC中,不过该项目基本上和宿主端没什么联系而并不是每个人都安装了ASP.NET MVC,所以宿主在可以使用Silverlight控件的Web Form中也许受众面更广泛一些)

在Silverlight的项目中分别新建三个文件夹Model、View、ViewModel并添加相应的文件,最终的解决方案视图如下

Model/DictModel.cs以及Model/SentModel.cs为纯粹的业务模型,所有的属性都必须实现IPropertyChanged接口以便在其值更改时可以同时更新UI。这两个类同时继承PropertyChangedBase,该基类很简单,请见我的另外一篇文章:让INotifyPropertyChanged的实现更优雅一些

这两个类的代码如下

DictModel.cs

using System;namespace EternalDict.Model
{public class DictModel : PropertyChangedBase{string _key;public string Key{get{return _key;}set{_key = value;this.NotifyPropertyChanged(p => p.Key);}}string _lang;public string Lang{get{return _lang;}set{_lang = value;this.NotifyPropertyChanged(p => p.Lang);}}string _audio;public string Audio{get{return _audio;}set{_audio = value;this.NotifyPropertyChanged(p => p.Audio);}}string _pron;public string Pron{get{return _pron == null ? string.Empty : string.Format("[{0}]", _pron);}set{_pron = value;this.NotifyPropertyChanged(p => p.Pron);}}string _def;public string Def{get{return _def;}set{_def = value;this.NotifyPropertyChanged(p => p.Def);}}System.Collections.ObjectModel.ObservableCollection<SentModel> _sentCollection;public System.Collections.ObjectModel.ObservableCollection<SentModel> SentCollection{get{return _sentCollection;}set{_sentCollection = value;this.NotifyPropertyChanged(p => p.SentCollection);}}}
}

SentModel.cs

using System;namespace EternalDict.Model
{public class SentModel : PropertyChangedBase{string _orig;public string Orig{get{return _orig;}set{_orig = value;this.NotifyPropertyChanged(p => p.Orig);}}string _trans;public string Trans{get{return _trans;}set{_trans = value;this.NotifyPropertyChanged(p => p.Trans);}}}
}

ViewModel/DictViewModel.cs则用来为View/DictView.xmal提供数据

这里我使用海词http://dict.cn/提供的API,通过Linq to XML进行解析。不过有个问题,海词的API可以提供GBK和UTF8这两种编码的服务,不过当前UTF8并不提供汉英翻译的功能,而silverlight并不支持GBK的编码转换,所以也只能实现英汉查找。也许某天你会发现汉英查找可用了,那么八成是海词官方升级了API。

该类的代码如下

using System;
using System.Net;
using System.Xml.Linq;
using System.Linq;
using System.Text;
using EternalDict.Model;namespace EternalDict.ViewModel
{public class DictViewModel{string _wordToQuery;public DictModel Dm { get { return _dm; } set { _dm = value; } }private DictModel _dm;public DictViewModel(){_dm = new DictModel();}public void QueryWord(string wordToQuery){this._wordToQuery = wordToQuery;string apiUrlString = string.Format("http://api.dict.cn/ws.php?utf8=true&q={0}", this._wordToQuery);Uri endPoint = new Uri(apiUrlString);WebClient client = new WebClient();client.DownloadStringAsync(endPoint);client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);}void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e){if (e.Error == null){this.ParseXml(e.Result);}}void ParseXml(string stringToParse){/*Silverlight不支持其他编码 囧Encoding gbk = Encoding.GetEncoding("GBK");Encoding utf8 = Encoding.UTF8;byte[] gbkBytes = gbk.GetBytes(stringToParse);byte[] utf8Bytes = Encoding.Convert(gbk, utf8, gbkBytes);char[] utf8Chars = new char[utf8.GetCharCount(utf8Bytes, 0, utf8Bytes.Length)];utf8.GetChars(utf8Bytes, 0, utf8Bytes.Length, utf8Chars, 0);stringToParse = new string(utf8Chars);*/XDocument xDoc = XDocument.Parse(stringToParse);var nodeDict = xDoc.Root;var audio = nodeDict.Elements().Where(p => p.Name == "audio").SingleOrDefault();var lang = nodeDict.Elements().Where(p => p.Name == "lang").SingleOrDefault();var pron = nodeDict.Elements().Where(p => p.Name == "pron").SingleOrDefault();var def = nodeDict.Element("def").Value;_dm.Audio = audio == null ? string.Empty : audio.Value;_dm.Def = def.Equals("Not Found") ? "未找到该单词的释义" : def;_dm.Key = this._wordToQuery;_dm.Lang = lang == null ? string.Empty : lang.Value;_dm.Pron = pron == null ? "无" : pron.Value;var eleSents = nodeDict.Elements().Where(p => p.Name == "sent");if (eleSents != null){_dm.SentCollection = new System.Collections.ObjectModel.ObservableCollection<SentModel>();foreach (var item in eleSents){SentModel sm = new SentModel();sm.Orig = item.Element("orig").Value;sm.Trans = item.Element("trans").Value;_dm.SentCollection.Add(sm);}}}}
}

这里公开了DictModel这个属性,用于为View提供数据。在View中完全通过数据绑定与其通讯。现在看下DictView.cs中最重要的几行代码

        DictViewModel dvm = new DictViewModel();public DictView(){InitializeComponent();Loaded += new RoutedEventHandler(Dict_Loaded);       }void Dict_Loaded(object sender, RoutedEventArgs e){this.DataContext = dvm;}

在View加载后便将ViewModel本身作为其DataContext。当点击查询按钮的时候便调用DictViewModel的QueryWord方法。

        private void btnLookUp_Click(object sender, RoutedEventArgs e){dvm.QueryWord(txtWord.Text.Trim());}

剩下的就是在DictView.xaml中进行UI的设计了,代码比较多就不贴了。比较关键的是

<StackPanel DataContext="{Binding Dm}" Orientation="Vertical" >

这里将BM绑定到该StackPanel的DataContext上,其可视化树上的所有子孙元素便都可以通过Binding与Model进行关联了。

源码下载:点此下载
在线体验:http://024hi.com/lab/ria/dict.html

转载于:https://www.cnblogs.com/024hi/archive/2009/06/14/1503169.html

[Silverlight]使用MVVM模式打造英汉词典相关推荐

  1. c语言程序报告英汉词典,C语言电子英汉词典程序设计报告-自动化1203-李煜明.docx...

    C语言电子英汉词典程序设计报告-自动化1203-李煜明 课 程 设 计 报 告课程名称 C语言课程设计 课题名称 电子英汉词典 专 业 自动化 班 级 1203 学 号 201201020304 姓 ...

  2. 【小型JavaFx项目】英汉词典

    英汉词典 简介 知识点简介 效果图 源代码 Word.java DictionaryFunction.java DictionaryFrame.java 简介 花了1个多小时帮数媒的同学用以前的项目改 ...

  3. APP Designer 制作简易英汉词典的回调函数书写

    APP Designer 制作简易英汉词典的回调函数书写 在学习MATLAB 的App Designer 时看到的一个有意思的小项目,主要步骤参考了slandarer 的MATLAB 手把手带你制作第 ...

  4. 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...

    英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...

  5. 基于linux的在线英汉词典(带源码)

    源码下载: 基于Linux的在线英汉词典-网络基础文档类资源-CSDN文库https://download.csdn.net/download/qq_63626307/86744311?spm=100 ...

  6. 英汉词典mysql_构建英汉词典数据库 java

    读入文本形式的牛津英汉词典文件InputDictionary.txt,将其存为规范的文本格式文件OutputDictionary.txt,字段之间以\t分隔希望能给出个具体的程序,不要提示.谢谢了In ...

  7. linux英汉字典代码,Ubuntu安装英汉词典(词库)详细步骤

    Ubuntu安装英汉词典(词库)详细步骤 发布时间:2013-05-26 11:26:08   作者:佚名   我要评论 linux并不缺少词典软件.但是缺少词库.所有的词典软件都需要,自己下载安装词 ...

  8. c语言电子英汉词典编程报告,电子英汉词典的编程C语言报告.doc

    课程设计(论文) 课 题: 电子英汉词典的编程 学 院: 专 业: 学生姓名: 学 号: 指导老师 : 目录 *内容摘要-----------.---..-------------..3 *关键词-- ...

  9. 电子英汉词典c语言设计报告,C语言课程设计——电子英汉词典汇编.doc

    PAGE 课 程 设 计 报 告 课程名称 C语言课程设计 课题名称 电子英汉词典 专 业 纺织服装学院 班 级 纺工1203 学 号 姓 名 指导教师 田 媛 2014年 01 月06 日 湖南工程 ...

最新文章

  1. aes js 加盐值 解密_crypto-js aes加密解密
  2. django框架的基础知识点《贰》
  3. 数据库 数据库SQL语句五
  4. 【sql进阶】查询每天、每个设备的第一条数据
  5. gettype拿不到值_这五种古董,别说是买豪车豪宅,放在现实中最多就值一顿饭钱...
  6. 2008年5月Windows Mobile Webcast预告
  7. vyos配置ds-nat
  8. FBX模型格式和FbxSDK
  9. Android判断首次安装
  10. Xposed小白入门,动态修改IMEI实例代码
  11. 十款开源在线视频播放器
  12. 使用SpEL表达式来获取SpringData Jpa在更新数据时传递的对象参数的属性
  13. 微信小程序--小程序及微信生态圈
  14. 201609-3 炉石传说
  15. 【办公类-11】20220611python 为每个孩子创建统一的照片整理三级文件夹
  16. android系统user/userdebug版本设置selinux到SELINUX_PERMISSIVE模式
  17. T6企业管理软件 7.1 - 登录账套提示“此账套的行业性质与科目设置中的分类不符,请调整”
  18. [MySQL] 日志刷盘机制
  19. 文本三剑客:sed编辑器
  20. 阿里云成为全球唯一完成德国C5云安全基础附加标准审计云服务商 数据安全获“最严谨”标准认可...

热门文章

  1. typora将html转为格式,Typora 修改配置文件实现自定义标签样式(常用)
  2. 以太坊服务器是什么_搭建以太坊节点服务器https API
  3. 001_Maven入门
  4. php写一个轻量级的容器,PHP写的一个轻量级的DI容器类
  5. waves效果器_盘点Waves的12款混响插件,你用的是哪个?
  6. http路径转file会变成反斜杠_PHP session反序列化漏洞
  7. java.lang.NoSuchMethodException: getPackageSizeInfo
  8. 自定义控件:侧滑面板
  9. 云上主机SSH秘钥对连接linux注意事项
  10. 四面体的表面积_JACS:武汉大学汪成课题组利用从平面至四面体的扭曲单体来合成COFs材料...