NumberKeyboard.xaml.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. using DryIoc;
  2. using System.Net;
  3. namespace HistoryView.Controls.Input;
  4. public partial class NumberKeyboard : UserControl
  5. {
  6. public NumberKeyboard()
  7. {
  8. InitializeComponent();
  9. }
  10. //private readonly Stopwatch sw = new();
  11. //Point _startPosition;
  12. private void presenter_TouchEnter(object sender, TouchEventArgs e)
  13. {
  14. //TouchPoint point = e.GetTouchPoint(this);
  15. //_startPosition = point.Position;
  16. //sw.Start();
  17. }
  18. private void presenter_TouchLeave(object sender, TouchEventArgs e)
  19. {
  20. //sw.Stop();
  21. //try
  22. //{
  23. // while (true)
  24. // {
  25. // if (sw.ElapsedMilliseconds >= 80)
  26. // return;
  27. // Point point = e.GetTouchPoint(this).Position;
  28. // if (Math.Abs(_startPosition.X - point.X) > 1)
  29. // return;
  30. // if (Math.Abs(_startPosition.Y - point.Y) > 1)
  31. // return;
  32. // break;
  33. // }
  34. // Show();
  35. //}
  36. //finally
  37. //{
  38. // sw.Reset();
  39. //}
  40. Show();
  41. }
  42. private void Show()
  43. {
  44. if (KeyboardPopStatus.IsDisplayed)
  45. return;
  46. KeyboardPopStatus.IsDisplayed = true;
  47. this.PopKeyboard.IsOpen = true;
  48. this.Display = this.Text?.ToString()!;
  49. }
  50. public object DisplayContent
  51. {
  52. get { return (object)GetValue(DisplayContentProperty); }
  53. set { SetValue(DisplayContentProperty, value); }
  54. }
  55. public static readonly DependencyProperty DisplayContentProperty =
  56. DependencyProperty.Register("DisplayContent", typeof(object), typeof(NumberKeyboard), new PropertyMetadata(default));
  57. public object Text
  58. {
  59. get { return (object)GetValue(TextProperty); }
  60. set { SetValue(TextProperty, value); }
  61. }
  62. public static readonly DependencyProperty TextProperty =
  63. DependencyProperty.Register("Text", typeof(object), typeof(NumberKeyboard), new PropertyMetadata(default));
  64. public string Display
  65. {
  66. get { return (string)GetValue(DisplayProperty); }
  67. set { SetValue(DisplayProperty, value); }
  68. }
  69. public static readonly DependencyProperty DisplayProperty =
  70. DependencyProperty.Register("Display", typeof(string), typeof(NumberKeyboard), new PropertyMetadata(default));
  71. private void CancelConfirm(object sender, RoutedEventArgs e)
  72. {
  73. if (sender is not Button button)
  74. return;
  75. if (button.CommandParameter is not string input)
  76. return;
  77. if (input == "Cancel")
  78. {
  79. this.Display = string.Empty;
  80. this.PopKeyboard.IsOpen = false;
  81. KeyboardPopStatus.IsDisplayed = false;
  82. Keyboard.ClearFocus();
  83. }
  84. switch (Type.GetTypeCode(this.Text.GetType()))
  85. {
  86. case TypeCode.Int16:
  87. if (!Int16.TryParse(this.Display, out short s))
  88. return;
  89. Text = s;
  90. break;
  91. case TypeCode.UInt16:
  92. if (!UInt16.TryParse(this.Display, out ushort us))
  93. return;
  94. Text = us;
  95. break;
  96. case TypeCode.Int32:
  97. if (!Int32.TryParse(this.Display, out int i))
  98. return;
  99. Text = i;
  100. break;
  101. case TypeCode.UInt32:
  102. if (!UInt32.TryParse(this.Display, out uint ui))
  103. return;
  104. Text = ui;
  105. break;
  106. case TypeCode.Int64:
  107. if (!Int64.TryParse(this.Display, out long l))
  108. return;
  109. Text = l;
  110. break;
  111. case TypeCode.UInt64:
  112. if (!UInt64.TryParse(this.Display, out ulong ul))
  113. return;
  114. Text = ul;
  115. break;
  116. case TypeCode.Single:
  117. if (!Single.TryParse(this.Display, out float f))
  118. return;
  119. Text = f;
  120. break;
  121. case TypeCode.Double:
  122. if (!Double.TryParse(this.Display, out double d))
  123. return;
  124. Text = d;
  125. break;
  126. case TypeCode.Decimal:
  127. if (!Decimal.TryParse(this.Display, out decimal dec))
  128. return;
  129. Text = dec;
  130. break;
  131. default:
  132. return;
  133. }
  134. this.PopKeyboard.IsOpen = false;
  135. KeyboardPopStatus.IsDisplayed = false;
  136. Keyboard.ClearFocus();
  137. }
  138. private void SendKey(object sender, RoutedEventArgs e)
  139. {
  140. if (sender is not Button button)
  141. return;
  142. if (button.CommandParameter is not string input)
  143. return;
  144. if (Text is null)
  145. return;
  146. string temp = Display.TrimStart('0');
  147. temp += input;
  148. bool success = Type.GetTypeCode(this.Text.GetType()) switch
  149. {
  150. TypeCode.Int16 => Int16.TryParse(temp, out _),
  151. TypeCode.UInt16 => UInt16.TryParse(temp, out _),
  152. TypeCode.Int32 => Int32.TryParse(temp, out _),
  153. TypeCode.UInt32 => UInt32.TryParse(temp, out _),
  154. TypeCode.Int64 => Int64.TryParse(temp, out _),
  155. TypeCode.UInt64 => UInt64.TryParse(temp, out _),
  156. TypeCode.Single => Single.TryParse(temp, out _),
  157. TypeCode.Double => Double.TryParse(temp, out _),
  158. TypeCode.Decimal => Decimal.TryParse(temp, out _),
  159. _ => false
  160. };
  161. if (!success)
  162. return;
  163. this.Display = temp;
  164. }
  165. private void Delete(object sender, RoutedEventArgs e)
  166. {
  167. if (Display.Length == 1)
  168. {
  169. Display = "0";
  170. return;
  171. }
  172. Display = Display[..^1];
  173. }
  174. private void Clear(object sender, RoutedEventArgs e)
  175. {
  176. Display = "0";
  177. }
  178. private void Operate(object sender, RoutedEventArgs e)
  179. {
  180. if (sender is not Button button)
  181. return;
  182. if (button.CommandParameter is not string Operate)
  183. return;
  184. switch (Type.GetTypeCode(this.Text.GetType()))
  185. {
  186. case TypeCode.Int16:
  187. if (!Int16.TryParse(this.Display, out short s))
  188. return;
  189. switch (Operate)
  190. {
  191. case "+1":
  192. Display = (s + 1).ToString();
  193. break;
  194. case "-1":
  195. Display = (s - 1).ToString();
  196. break;
  197. default:
  198. return;
  199. }
  200. break;
  201. case TypeCode.UInt16:
  202. if (!UInt16.TryParse(this.Display, out ushort us))
  203. return;
  204. switch (Operate)
  205. {
  206. case "+1":
  207. Display = (us + 1).ToString();
  208. break;
  209. case "-1":
  210. Display = (us - 1).ToString();
  211. break;
  212. default:
  213. return;
  214. }
  215. break;
  216. case TypeCode.Int32:
  217. if (!Int32.TryParse(this.Display, out int i))
  218. return;
  219. switch (Operate)
  220. {
  221. case "+1":
  222. Display = (i + 1).ToString();
  223. break;
  224. case "-1":
  225. Display = (i - 1).ToString();
  226. break;
  227. default:
  228. return;
  229. }
  230. break;
  231. case TypeCode.UInt32:
  232. if (!UInt32.TryParse(this.Display, out uint ui))
  233. return;
  234. switch (Operate)
  235. {
  236. case "+1":
  237. Display = (ui + 1).ToString();
  238. break;
  239. case "-1":
  240. Display = (ui - 1).ToString();
  241. break;
  242. default:
  243. return;
  244. }
  245. break;
  246. case TypeCode.Int64:
  247. if (!Int64.TryParse(this.Display, out long l))
  248. return;
  249. switch (Operate)
  250. {
  251. case "+1":
  252. Display = (l + 1).ToString();
  253. break;
  254. case "-1":
  255. Display = (l - 1).ToString();
  256. break;
  257. default:
  258. return;
  259. }
  260. break;
  261. case TypeCode.UInt64:
  262. if (!UInt64.TryParse(this.Display, out ulong ul))
  263. return;
  264. switch (Operate)
  265. {
  266. case "+1":
  267. Display = (ul + 1).ToString();
  268. break;
  269. case "-1":
  270. Display = (ul - 1).ToString();
  271. break;
  272. default:
  273. return;
  274. }
  275. break;
  276. case TypeCode.Single:
  277. if (!Single.TryParse(this.Display, out float f))
  278. return;
  279. switch (Operate)
  280. {
  281. case "+1":
  282. Display = (f + 1f).ToString("0.0");
  283. break;
  284. case "-1":
  285. Display = (f - 1f).ToString("0.0");
  286. break;
  287. default:
  288. return;
  289. case "-.1":
  290. Display = (f - 0.1f).ToString("0.0");
  291. break;
  292. case "+.1":
  293. Display = (f + 0.1f).ToString("0.0");
  294. break;
  295. }
  296. break;
  297. case TypeCode.Double:
  298. if (!Double.TryParse(this.Display, out double d))
  299. return;
  300. switch (Operate)
  301. {
  302. case "+1":
  303. Display = (d + 1d).ToString("0.0");
  304. break;
  305. case "-1":
  306. Display = (d - 1d).ToString("0.0");
  307. break;
  308. default:
  309. return;
  310. case "-.1":
  311. Display = (d - 0.1d).ToString("0.0");
  312. break;
  313. case "+.1":
  314. Display = (d + 0.1d).ToString("0.0");
  315. break;
  316. }
  317. break;
  318. case TypeCode.Decimal:
  319. if (!Decimal.TryParse(this.Display, out decimal dec))
  320. return;
  321. switch (Operate)
  322. {
  323. case "+1":
  324. Display = (dec + 1).ToString();
  325. break;
  326. case "-1":
  327. Display = (dec - 1).ToString();
  328. break;
  329. case "-.1":
  330. Display = (dec - (decimal)0.1).ToString();
  331. break;
  332. case "+.1":
  333. Display = (dec + (decimal)0.1).ToString();
  334. break;
  335. default:
  336. return;
  337. }
  338. break;
  339. default:
  340. return;
  341. }
  342. }
  343. private void Button_TouchDown(object sender, TouchEventArgs e)
  344. {
  345. if (sender is not Button button)
  346. return;
  347. if (this.Hint.IsOpen)
  348. this.Hint.IsOpen = false;
  349. this.HintText.Text = (string)button.Content;
  350. this.Hint.PlacementTarget = button;
  351. this.Hint.IsOpen = true;
  352. }
  353. private void Button_TouchLeave(object sender, TouchEventArgs e)
  354. {
  355. Task.Factory.StartNew(() =>
  356. {
  357. Thread.Sleep(200);
  358. App.Current.Dispatcher.Invoke(() =>
  359. {
  360. this.Hint.IsOpen = false;
  361. });
  362. });
  363. }
  364. private void presenter_GotFocus(object sender, RoutedEventArgs e)
  365. {
  366. Show();
  367. }
  368. }