当前位置: 移动技术网 > IT编程>移动开发>WP > Universal Windows Platform 第二弹 移动版秒变桌面版 实践:罗马数计算器

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

2018年09月29日  | 移动技术网IT编程  | 我要评论

赵欣瑜 叶选廉,有时忽惆怅,地牢猎手4黑铁bug

背景

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

传送门: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;
}

结语

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

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

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

okbye……

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网