博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【UWP应用开发实战】第二弹 移动版秒变桌面版 实践:罗马数计算器
阅读量:7026 次
发布时间:2019-06-28

本文共 4983 字,大约阅读时间需要 16 分钟。

背景

想想通用应用平台终于诞生了,正好又碰到两个挺有意思的题目:

传送门:

传送门:

于是就打算将它们整合成个一个简单的App吧,虽然功能不多,但万一有用户需要呢?常规的计算器功能我没实现,系统自带的已经非常好了。

个人是很喜欢Pivot控件的,可以左右滑动,挺好使的。这里就用它了,和UWP搭配,堪称完美。

界面

具体布局代码我就不细说了,感觉实在没什么好说了,相信看过前面写的Windows App系列文章的童鞋们都可以实现出来了,我就直接上截图了。

先来看看移动版的(补充一个段子吧,微软宣布Windows 10 Mobile中文名叫做Windows 10 移动版,那以后手机岂不是有Windows 10 移动版移动版和Windows 10 移动版联通版了),这里我还留了挺多空格没有使用,后续如果发现有什么功能需要跟进再进行补充了。

这里写图片描述

这里写图片描述

通用应用超赞的亮点

如果你还没有开发过通用应用,那我来教你如何秒变桌面版吧。在下面所示的窗口中,你就可以自由切换了,即便是IoT(Internet of Things)也是可以的喔,还有强大的Surface Hub。

这里写图片描述

切换之后呢?duang……

这里写图片描述



预警……下面是关键部分!



这里写图片描述

但是,用过Windows 10 的童鞋们都知道所有App都是可以随意放大以及缩小的,那么我们也试试呢?

这里写图片描述

这里写图片描述

哈?这是咋回事……

放大设计器后,你就会发现这么小锁喔……

这里写图片描述

何不试试将小锁都锁上呢?我用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);    }}

关于复制图片,这里还有一部分,传送门: ,请自行找到第三部分“使用粘贴板”。

如何进行计算呢

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;}

结语

自我感觉写这篇博客的时间比写这个App的时间还要短,不过为了发布到应用商店所花的时间还是略长的……

大家可以下载看看,传送门: 。

大家有什么建议或意见欢迎告诉我(邮箱在博客左侧边栏),一起改进这个应用,当然了,如果你自己写一遍然后发到应用商店我也不介意。

Okbye……

号外

求投票或转发支持呀……希望我不要死得太惨了……

请点击这里:

投票从10号开始一直持续到20号,拜托各位了!

你可能感兴趣的文章
OSX终端 命令行的一些基本操作
查看>>
再谈ORACLE CPROCD进程
查看>>
MVC5+EF6 入门完整教程五
查看>>
Sqlserver Sequence操作
查看>>
开发创建XMPP“发布订阅”扩展(xmpp pubsub extend)
查看>>
TCP/IP-协议族----17、应用层简单
查看>>
ZOJ1093 动态规划
查看>>
.Echo 命令中经常提到回显,是什么意思?
查看>>
MySQL在大数据Limit使用
查看>>
iOS中如何创建一个滑出式导航面板(1)
查看>>
Solr5.3.1整合IKAnalyzer
查看>>
Swift - 06 - 数值类型转换和类型别名
查看>>
华为3G模块EM770W在LINUX下的驱动安装
查看>>
omnet++4.0安装使用
查看>>
Jquery JSOPN在WebApi中的问题
查看>>
[React Testing] Conditional className with Shallow Rendering
查看>>
a or an
查看>>
Coursera课程《大家的python》(Python for everyone)课件
查看>>
PHP程序猿必须学习的第二课——站点安全问题预防
查看>>
2016第5周三
查看>>