using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Tango.Core.EventArguments; using Tango.Touch.Keyboard; namespace Tango.Touch.Controls { public class TouchTextBox : TouchInput { private TextBox _text_box; private PasswordBox _password_box; private DateTime _lost_focus_time; public event EventHandler TextChanged; public String Text { get { return (String)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(TouchTextBox), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (d, e) => (d as TouchTextBox).OnTextChanged())); public int MaxLength { get { return (int)GetValue(MaxLengthProperty); } set { SetValue(MaxLengthProperty, value); } } public static readonly DependencyProperty MaxLengthProperty = DependencyProperty.Register("MaxLength", typeof(int), typeof(TouchTextBox), new PropertyMetadata(0)); private void OnTextChanged() { TextChanged?.Invoke(this, new EventArgs()); } public String Watermark { get { return (String)GetValue(WatermarkProperty); } set { SetValue(WatermarkProperty, value); } } public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark", typeof(String), typeof(TouchTextBox), new PropertyMetadata(null)); public bool IsPassword { get { return (bool)GetValue(IsPasswordProperty); } set { SetValue(IsPasswordProperty, value); } } public static readonly DependencyProperty IsPasswordProperty = DependencyProperty.Register("IsPassword", typeof(bool), typeof(TouchTextBox), new PropertyMetadata(false)); public bool IsReadOnly { get { return (bool)GetValue(IsReadOnlyProperty); } set { SetValue(IsReadOnlyProperty, value); } } public static readonly DependencyProperty IsReadOnlyProperty = DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(TouchTextBox), new PropertyMetadata(false)); public ICommand TapCommand { get { return (ICommand)GetValue(TapCommandProperty); } set { SetValue(TapCommandProperty, value); } } public static readonly DependencyProperty TapCommandProperty = DependencyProperty.Register("TapCommand", typeof(ICommand), typeof(TouchTextBox), new PropertyMetadata(null)); public Object TapCommandParameter { get { return (Object)GetValue(TapCommandParameterProperty); } set { SetValue(TapCommandParameterProperty, value); } } public static readonly DependencyProperty TapCommandParameterProperty = DependencyProperty.Register("TapCommandParameter", typeof(Object), typeof(TouchTextBox), new PropertyMetadata(null)); public int CaretIndex { get { return _text_box != null ? _text_box.CaretIndex : 0; } set { if (_text_box != null) { _text_box.CaretIndex = value; } } } static TouchTextBox() { DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchTextBox), new FrameworkPropertyMetadata(typeof(TouchTextBox))); } public override void OnApplyTemplate() { base.OnApplyTemplate(); _text_box = GetTemplateChild("PART_TextBox") as TextBox; _password_box = GetTemplateChild("PART_PasswordBox") as PasswordBox; _text_box.GotFocus += _text_box_GotFocus; _text_box.LostFocus += _text_box_LostFocus; this.RegisterForPreviewMouseOrTouchUp(OnMouseOrTouchUp); } private void _text_box_LostFocus(object sender, RoutedEventArgs e) { _lost_focus_time = DateTime.Now; } private void OnMouseOrTouchUp(object sender, MouseOrTouchEventArgs e) { if (TapCommand != null) { TapCommand.Execute(TapCommandParameter); } } private async void _text_box_GotFocus(object sender, RoutedEventArgs e) { if (DateTime.Now > _lost_focus_time.AddMilliseconds(200)) { await Task.Delay(50); if (FocusSelectionMode == FocusSelectionMode.SelectAll) { _text_box.SelectAll(); } else if (FocusSelectionMode == FocusSelectionMode.ScrollToEnd) { _text_box.CaretIndex = _text_box.Text.Length; } } } public new void Focus() { if (IsPassword) { _password_box.Focus(); } else { _text_box.Focus(); } } } }