Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器
背景
想想通用应用平台终于诞生了,正好又碰到两个挺有意思的题目:
传送门:leetcode 12 integer to roman(整型数到罗马数)
传送门:leetcode 13 roman to integer(罗马数到整型数)
于是就打算将它们整合成个一个简单的app吧,虽然功能不多,但万一有用户需要呢?常规的计算器功能我没实现,自带的已经非常好了。
个人是很喜欢pivot控件的,可以左右滑动,挺好使的。这里就用它了,和uwp搭配,堪称完美。
界面
具体布局代码我就不细说了,感觉实在没什么好说了,相信看过前面写的windows app系列文章的童鞋们都可以实现出来了,我就直接上截图了。
先来看看移动版的(补充一个段子吧,微软宣布windows 10 mobile中文名叫做windows 10 移动版,那以后手机岂不是有windows 10 移动版移动版和windows 10 移动版联通版了),这里我还留了挺多空格没有使用,后续如果发现有什么功能需要跟进再进行补充了。
通用应用超赞的亮点
如果你还没有开发过通用应用,那我来教你如何秒变桌面版吧。在下面所示的窗口中,你就可以*切换了,即便是iot(internet of things)也是可以的喔,还有强大的surface hub。
切换之后呢?duang……
预警……下面是关键部分!
但是,用过windows 10 的童鞋们都知道所有app都是可以随意放大以及缩小的,那么我们也试试呢?
哈?这是咋回事……
放大设计器后,你就会发现这么小锁喔……喎? f/ware/vc/"="" target="_blank" class="keylink">vcd4ncjxwpjxpbwcgywx0pq=="这里写图片描述" src="/uploadfile/collfiles/20151026/2015102608415973.png" title="\" />
何不试试将小锁都锁上呢?我用gif录制了一段,大家看看,有没有感觉很神奇呢?
相比android上的各种适配问题,这个简直不要太赞呀!
开始筹备
那么就来实现具体功能好啦,其实吧,我感觉这部分都没必要写了,你所需要的就是这4个字符串,用于保存用户输入的字符串和输出,之所以各设置2个是因为这里既需要从阿拉伯数转罗马数,也需要从罗马数转阿拉伯数。
private string _readytocalc = ; private string _output = ; private string _readytocalc2 = ; private string _output2 = ;
那么对于要输出的各种数据呢,我就用的listview,简单易用,还很省事。
键入数字(阿拉伯数和罗马数)
点击数字0的click事件,其他的都是一样的了,共用addnumber方法而已:
private void btnname0_click(object sender, routedeventargs e) { addnumber(0); tbinput.text = _readytocalc; } private void addnumber(int num) { _readytocalc += num.tostring(); }
点击确定后的事件,也就是开始计算了。计算出_output后将它添加到lvoutput上。
private void btncalc_click(object sender, routedeventargs e) { try { int number = int.parse(_readytocalc); _output = inttoroman(number); lvoutput.items?.add(_output); } catch (exception) { // ignored } _readytocalc = ; tbinput.text = ; }
相应的清理按钮的事件:
private void btnclear_click(object sender, routedeventargs e) { _readytocalc = ; tbinput.text = ; } private void btnclearrecord_click(object sender, routedeventargs e) { lvoutput.items?.clear(); }
罗马数字的也一样了:
private void btnnamei_click(object sender, routedeventargs e) { addroman(i); tbinput2.text = _readytocalc2; } private void addroman(string roman) { _readytocalc2 += roman; } private void btncalc2_click(object sender, routedeventargs e) { try { _output2 = romantoint(_readytocalc2).tostring(); lvoutput2.items?.add(_output2); } catch (exception) { // ignored } _readytocalc2 = ; tbinput2.text = ; } private void btnclear2_click(object sender, routedeventargs e) { _readytocalc2 = ; tbinput2.text = ; } private void btnclearrecord2_click(object sender, routedeventargs e) { lvoutput2.items?.clear(); }
双击复制
对于用户输入的阿拉伯数,应用给转换成了罗马数,但还得用户自己记下来再到其他地方键入,是不是不太合理?所以,这里应该有一个双击复制的功能。
private void lvoutput_doubletapped(object sender, doubletappedroutedeventargs e) { datapackage dp = new datapackage(); if (lvoutput.selecteditem != null) { dp.settext(lvoutput.selecteditem.tostring()); clipboard.setcontent(dp); } }
关于复制图片,这里还有一部分,传送门:windows app开发之集成设置、帮助、搜索和共享 ,请自行找到第三部分“使用粘贴板”。
如何进行计算呢
public enum roman { m = 1000, cm = 900, d = 500, cd = 400, c = 100, xc = 90, l = 50, xl = 40, x = 10, ix = 9, v = 5, iv = 4, i = 1 };
public int romantoint(string s) { int result = 0; type r = typeof(roman); string first, second; if (s.length > 1) { first = s.substring(0, 1); second = s.substring(0, 2); } else { first = s.substring(0, 1); second = ; } foreach (var r in enum.getnames(r).reverse()) { while ((r.length == 1 && first == r) || (r.length == 2 && second == r)) { result += int.parse(enum.format(r, enum.parse(r, r), d)); int lenr = r.length, lens = s.length; if (lens - lenr < 1) s = ; else s = s.substring(lenr, lens - lenr); if (s.length > 1) { first = s.substring(0, 1); second = s.substring(0, 2); } else if (s.length == 1) { first = s.substring(0, 1); second = ; } else { first = ; second = ; } } } return result; } public string inttoroman(int num) { string result = ; type r = typeof(roman); foreach (var r in enum.getnames(r).reverse()) { while (num >= int.parse(enum.format(r, enum.parse(r, r), d))) { result += r.tostring(); num -= int.parse(enum.format(r, enum.parse(r, r), d)); } } return result; }
结语
自我感觉写这篇博客的时间比写这个
大家可以下载看看,传送门:罗马数计算器 。
大家有什么建议或意见欢迎告诉我(邮箱在博客左侧边栏),一起改进这个应用,当然了,如果你自己写一遍然后发到应用商店我也不介意。
喎?>
上一篇: Asp.net中GridView使用详解