1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
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();
}
}
}
}
|