123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- using DryIoc;
- using System.Net;
- namespace HistoryView.Controls.Input;
- public partial class NumberKeyboard : UserControl
- {
- public NumberKeyboard()
- {
- InitializeComponent();
- }
- //private readonly Stopwatch sw = new();
- //Point _startPosition;
- private void presenter_TouchEnter(object sender, TouchEventArgs e)
- {
- //TouchPoint point = e.GetTouchPoint(this);
- //_startPosition = point.Position;
- //sw.Start();
- }
- private void presenter_TouchLeave(object sender, TouchEventArgs e)
- {
- //sw.Stop();
- //try
- //{
- // while (true)
- // {
- // if (sw.ElapsedMilliseconds >= 80)
- // return;
- // Point point = e.GetTouchPoint(this).Position;
- // if (Math.Abs(_startPosition.X - point.X) > 1)
- // return;
- // if (Math.Abs(_startPosition.Y - point.Y) > 1)
- // return;
- // break;
- // }
- // Show();
- //}
- //finally
- //{
- // sw.Reset();
- //}
- Show();
- }
- private void Show()
- {
- if (KeyboardPopStatus.IsDisplayed)
- return;
- KeyboardPopStatus.IsDisplayed = true;
- this.PopKeyboard.IsOpen = true;
- this.Display = this.Text?.ToString()!;
- }
- public object DisplayContent
- {
- get { return (object)GetValue(DisplayContentProperty); }
- set { SetValue(DisplayContentProperty, value); }
- }
- public static readonly DependencyProperty DisplayContentProperty =
- DependencyProperty.Register("DisplayContent", typeof(object), typeof(NumberKeyboard), new PropertyMetadata(default));
- public object Text
- {
- get { return (object)GetValue(TextProperty); }
- set { SetValue(TextProperty, value); }
- }
- public static readonly DependencyProperty TextProperty =
- DependencyProperty.Register("Text", typeof(object), typeof(NumberKeyboard), new PropertyMetadata(default));
- public string Display
- {
- get { return (string)GetValue(DisplayProperty); }
- set { SetValue(DisplayProperty, value); }
- }
- public static readonly DependencyProperty DisplayProperty =
- DependencyProperty.Register("Display", typeof(string), typeof(NumberKeyboard), new PropertyMetadata(default));
- private void CancelConfirm(object sender, RoutedEventArgs e)
- {
- if (sender is not Button button)
- return;
- if (button.CommandParameter is not string input)
- return;
- if (input == "Cancel")
- {
- this.Display = string.Empty;
- this.PopKeyboard.IsOpen = false;
- KeyboardPopStatus.IsDisplayed = false;
- Keyboard.ClearFocus();
- }
- switch (Type.GetTypeCode(this.Text.GetType()))
- {
- case TypeCode.Int16:
- if (!Int16.TryParse(this.Display, out short s))
- return;
- Text = s;
- break;
- case TypeCode.UInt16:
- if (!UInt16.TryParse(this.Display, out ushort us))
- return;
- Text = us;
- break;
- case TypeCode.Int32:
- if (!Int32.TryParse(this.Display, out int i))
- return;
- Text = i;
- break;
- case TypeCode.UInt32:
- if (!UInt32.TryParse(this.Display, out uint ui))
- return;
- Text = ui;
- break;
- case TypeCode.Int64:
- if (!Int64.TryParse(this.Display, out long l))
- return;
- Text = l;
- break;
- case TypeCode.UInt64:
- if (!UInt64.TryParse(this.Display, out ulong ul))
- return;
- Text = ul;
- break;
- case TypeCode.Single:
- if (!Single.TryParse(this.Display, out float f))
- return;
- Text = f;
- break;
- case TypeCode.Double:
- if (!Double.TryParse(this.Display, out double d))
- return;
- Text = d;
- break;
- case TypeCode.Decimal:
- if (!Decimal.TryParse(this.Display, out decimal dec))
- return;
- Text = dec;
- break;
- default:
- return;
- }
- this.PopKeyboard.IsOpen = false;
- KeyboardPopStatus.IsDisplayed = false;
- Keyboard.ClearFocus();
- }
- private void SendKey(object sender, RoutedEventArgs e)
- {
- if (sender is not Button button)
- return;
- if (button.CommandParameter is not string input)
- return;
- if (Text is null)
- return;
- string temp = Display.TrimStart('0');
- temp += input;
- bool success = Type.GetTypeCode(this.Text.GetType()) switch
- {
- TypeCode.Int16 => Int16.TryParse(temp, out _),
- TypeCode.UInt16 => UInt16.TryParse(temp, out _),
- TypeCode.Int32 => Int32.TryParse(temp, out _),
- TypeCode.UInt32 => UInt32.TryParse(temp, out _),
- TypeCode.Int64 => Int64.TryParse(temp, out _),
- TypeCode.UInt64 => UInt64.TryParse(temp, out _),
- TypeCode.Single => Single.TryParse(temp, out _),
- TypeCode.Double => Double.TryParse(temp, out _),
- TypeCode.Decimal => Decimal.TryParse(temp, out _),
- _ => false
- };
- if (!success)
- return;
- this.Display = temp;
- }
- private void Delete(object sender, RoutedEventArgs e)
- {
- if (Display.Length == 1)
- {
- Display = "0";
- return;
- }
- Display = Display[..^1];
- }
- private void Clear(object sender, RoutedEventArgs e)
- {
- Display = "0";
- }
- private void Operate(object sender, RoutedEventArgs e)
- {
- if (sender is not Button button)
- return;
- if (button.CommandParameter is not string Operate)
- return;
- switch (Type.GetTypeCode(this.Text.GetType()))
- {
- case TypeCode.Int16:
- if (!Int16.TryParse(this.Display, out short s))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (s + 1).ToString();
- break;
- case "-1":
- Display = (s - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.UInt16:
- if (!UInt16.TryParse(this.Display, out ushort us))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (us + 1).ToString();
- break;
- case "-1":
- Display = (us - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.Int32:
- if (!Int32.TryParse(this.Display, out int i))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (i + 1).ToString();
- break;
- case "-1":
- Display = (i - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.UInt32:
- if (!UInt32.TryParse(this.Display, out uint ui))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (ui + 1).ToString();
- break;
- case "-1":
- Display = (ui - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.Int64:
- if (!Int64.TryParse(this.Display, out long l))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (l + 1).ToString();
- break;
- case "-1":
- Display = (l - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.UInt64:
- if (!UInt64.TryParse(this.Display, out ulong ul))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (ul + 1).ToString();
- break;
- case "-1":
- Display = (ul - 1).ToString();
- break;
- default:
- return;
- }
- break;
- case TypeCode.Single:
- if (!Single.TryParse(this.Display, out float f))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (f + 1f).ToString("0.0");
- break;
- case "-1":
- Display = (f - 1f).ToString("0.0");
- break;
- default:
- return;
- case "-.1":
- Display = (f - 0.1f).ToString("0.0");
- break;
- case "+.1":
- Display = (f + 0.1f).ToString("0.0");
- break;
- }
- break;
- case TypeCode.Double:
- if (!Double.TryParse(this.Display, out double d))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (d + 1d).ToString("0.0");
- break;
- case "-1":
- Display = (d - 1d).ToString("0.0");
- break;
- default:
- return;
- case "-.1":
- Display = (d - 0.1d).ToString("0.0");
- break;
- case "+.1":
- Display = (d + 0.1d).ToString("0.0");
- break;
- }
- break;
- case TypeCode.Decimal:
- if (!Decimal.TryParse(this.Display, out decimal dec))
- return;
- switch (Operate)
- {
- case "+1":
- Display = (dec + 1).ToString();
- break;
- case "-1":
- Display = (dec - 1).ToString();
- break;
- case "-.1":
- Display = (dec - (decimal)0.1).ToString();
- break;
- case "+.1":
- Display = (dec + (decimal)0.1).ToString();
- break;
- default:
- return;
- }
- break;
- default:
- return;
- }
- }
- private void Button_TouchDown(object sender, TouchEventArgs e)
- {
- if (sender is not Button button)
- return;
- if (this.Hint.IsOpen)
- this.Hint.IsOpen = false;
- this.HintText.Text = (string)button.Content;
- this.Hint.PlacementTarget = button;
- this.Hint.IsOpen = true;
- }
- private void Button_TouchLeave(object sender, TouchEventArgs e)
- {
- Task.Factory.StartNew(() =>
- {
- Thread.Sleep(200);
- App.Current.Dispatcher.Invoke(() =>
- {
- this.Hint.IsOpen = false;
- });
- });
- }
- private void presenter_GotFocus(object sender, RoutedEventArgs e)
- {
- Show();
- }
- }
|