想想通用應用平臺終于誕生了,正好又碰到兩個挺有意思的題目:
傳送門: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;
}
自我感覺寫這篇博客的時間比寫這個
大家可以下載看看,傳送門:羅馬數計算器 。
大家有什么建議或意見歡迎告訴我(郵箱在博客左側邊欄),一起改進這個應用,當然了,如果你自己寫一遍然后發到應用商店我也不介意。