【UWP应用开发实战】第二弹 移动版秒变桌面版 实践:罗马数计算器

背景

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

传送门: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都是可以随意放大以及缩小的,那么我们也试试呢?

哈?这是咋回事……

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

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

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

开始筹备

那么就来实现具体功能好啦,其实吧,我感觉这部分都没必要写了,你所需要的就是这4个字符串,用于保存用户输入的字符串和输出,之所以各设置2个是因为这里既需要从阿拉伯数转罗马数,也需要从罗马数转阿拉伯数。

private string _readyToCalc = "";
private string _output = "";

private string _readyToCalc2 = "";
private string _output2 = "";

那么对于要输出的各种数据呢,我就用的ListView,简单易用,还很省事。

<ListView Name="LvOutput" Grid.Row="0" DoubleTapped="LvOutput_DoubleTapped"  />

键入数字(阿拉伯数和罗马数)

点击数字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的时间还要短,不过为了发布到应用商店所花的时间还是略长的……

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

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

Ok,bye……

号外

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

请点击这里:投票

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


——————当然你也可以直接点击图片啦

时间: 2024-09-17 04:30:39

【UWP应用开发实战】第二弹 移动版秒变桌面版 实践:罗马数计算器的相关文章

【UWP应用开发实战】第一弹 使用剪切板

不知道是否还有童鞋记得我上半年写的一系列Windows App开发的博客,那时候Windows 10还处于预览版,UWP(Universal Windows Platform)当时也还处于雏形阶段. 在当时的专栏的首篇中,我们就展望过UWP,而如今的UWP简直是更上百层楼了,定当让你刮目相看. 不过,这一篇还是先来介绍一下剪切板的功能,因为之前的文章仅仅是介绍了从应用外剪切/复制到应用内,并没有介绍如何剪切到应用外,这里就通过一个小小的示例来看看吧. 复制文本 private void BtnC

《STM32库开发实战指南:基于STM32F103(第2版)》——3.1节安装USB转串口驱动

3.1 安装USB转串口驱动 秉火的STM32开发板用的USB转串口的驱动芯片是CH340,要使用串口,需要先在电脑中安装USB转串口驱动:CH340版本,见图3-1.驱动可在网上搜索下载,或者使用我们论坛里面提供的.Windows 7用户请用管理员身份安装.如果不能安装成功,上网查找原因自行解决. 如果USB转串口驱动安装成功,USB线与板子连接没有问题,依次选择"计算机→管理→设备管理器→端口",可识别到串口. 如果识别不了串口,请检查USB线是否完好,或换一根USB线试试.

《STM32库开发实战指南:基于STM32F103(第2版)》——第3章如何用串口下载程序

第3章 如何用串口下载程序 秉火STM32F103VET6(指南者)自带串口下载电路,配合上位机可实现一键ISP下载,不需要修改开发板上的BOOT设置.与仿真器Fire-Debugger相比,ISP(In-System Programming,在系统可编程)只能下载程序,不能在线调试且下载速度慢.

《STM32库开发实战指南:基于STM32F103(第2版)》——导读

目 录 前言第一部分 基础篇第1章 如何安装KEIL51.1 温馨提示1.2 获取KEIL5安装包1.3 开始安装KEIL51.4 安装STM32芯片包第2章 如何用DAP仿真器下载程序2.1 仿真器简介 2.2 硬件连接2.3 仿真器配置2.4 选择目标板2.5 下载程序第3章 如何用串口下载程序3.1 安装USB转串口驱动3.2 硬件连接3.3 开始下载3.4 ISP一键下载原理分析第4章 初识STM324.1 什么是STM324.2 STM32能做什么4.2.1 智能手环4.3 STM32

《STM32库开发实战指南:基于STM32F103(第2版)》——3.2节硬件连接

3.2 硬件连接如图3-2所示,用USB线连接电脑和开发板的"USB转串口"接口,给开发板上电(见图3-3).

《STM32库开发实战指南:基于STM32F103(第2版)》——2.2节硬件连接

2.2 硬件连接把仿真器用USB线连接至电脑,如果仿真器的灯亮则表示正常,可以使用.再把仿真器的另外一端连接到开发板,给开发板上电,就可以通过软件KEIL或者IAR给开发板下载程序,见图2-1.仿真器与指南者连接图见图2-2,与霸道连接图见图2-3.

《STM32库开发实战指南:基于STM32F103(第2版)》——1.3节开始安装KEIL5

1.3 开始安装KEIL5下载好安装文件后,双击KEIL5的安装包,在弹出的对话框中点击Next按钮开始安装,见图1-2. 选择安装路径,路径名中不能带中文,单击Next按钮,见图1-4.填写用户信息,全部填空格(按键盘的Space键)即可,单击Next按钮,见图1-5.单击Finish按钮,安装完成,见图1-6.

《STM32库开发实战指南:基于STM32F103(第2版)》——2.3节仿真器配置

2.3 仿真器配置在仿真器连接好电脑和开发板且开发板供电正常的情况下,打开编译软件KEIL,在魔术棒选项卡里面选择仿真器的型号,具体步骤如下:1)配置Debug选项,见图2-4. 3)配置Debug Settings 选项,见图2-6.

《STM32库开发实战指南:基于STM32F103(第2版)》——2.4节选择目标板

2.4 选择目标板选择目标板,具体选择多大的Flash要根据板子上的芯片型号决定.秉火STM32开发板的配置是:F1选512K,F4选1M.这里面有个小技巧就是勾选Reset and Run复选框,这样程序下载完之后就会自动运行,否则需要手动复位.擦除的Flash大小选择Sectors即可,不要选择Full Chip,会非常慢.具体选项见图2-7.