欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

程序员文章站 2022-04-12 08:50:22
背景 想想通用应用平台终于诞生了,正好又碰到两个挺有意思的题目: 传送门:leetcode 12 integer to roman(整型数到罗马数) 传送门:leetcode 13 roman to...

背景

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

传送门:leetcode 12 integer to roman(整型数到罗马数)
传送门:leetcode 13 roman to integer(罗马数到整型数)

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

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

界面

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

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

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

通用应用超赞的亮点

如果你还没有开发过通用应用,那我来教你如何秒变桌面版吧。在下面所示的窗口中,你就可以*切换了,即便是iot(internet of things)也是可以的喔,还有强大的surface hub。

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

切换之后呢?duang……

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器



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



Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

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

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

哈?这是咋回事……

放大设计器后,你就会发现这么小锁喔……喎? f/ware/vc/"="" target="_blank" class="keylink">vcd4ncjxwpjxpbwcgywx0pq=="这里写图片描述" src="/uploadfile/collfiles/20151026/2015102608415973.png" title="\" />

何不试试将小锁都锁上呢?我用gif录制了一段,大家看看,有没有感觉很神奇呢?

相比android上的各种适配问题,这个简直不要太赞呀!

Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

开始筹备

那么就来实现具体功能好啦,其实吧,我感觉这部分都没必要写了,你所需要的就是这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;
}

结语

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

大家可以下载看看,传送门:罗马数计算器 。

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

okbye……

 

喎?>