頻道欄目
首頁 > 資訊 > Windows Phone > 正文

Universal Windows Platform 第二彈 移動版秒變桌面版 實踐:羅馬數計算器

15-10-26        來源:[db:作者]  
收藏   我要投稿

背景

想想通用應用平臺終于誕生了,正好又碰到兩個挺有意思的題目:

傳送門: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,簡單易用,還很省事。

鍵入數字(阿拉伯數和羅馬數)

點擊數字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……

 

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片