-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEditableCheckBox.cs
More file actions
127 lines (106 loc) · 3.83 KB
/
Copy pathEditableCheckBox.cs
File metadata and controls
127 lines (106 loc) · 3.83 KB
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
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
namespace ToDoNote;
public class EditableCheckBox : CheckBox
{
private DispatcherTimer _clickTimer;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (GetTemplateChild("textEditor") is TextBox textBox)
{
textBox.KeyDown += TextBox_KeyDown;
textBox.LostFocus += TextBox_LostFocus; // Добавляем обработку потери фокуса
}
}
public EditableCheckBox()
{
InitializeClickTimer();
PreviewMouseLeftButtonDown += EditableCheckBox_PreviewMouseLeftButtonDown;
LostFocus += EditableCheckBox_LostFocus; // Обработка потери фокуса контролом
}
private void InitializeClickTimer()
{
_clickTimer = new DispatcherTimer();
_clickTimer.Interval = TimeSpan.FromMilliseconds(200);
_clickTimer.Tick += ClickTimer_Tick;
}
private void EditableCheckBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (IsEditing())
return;
if (e.ClickCount == 2)
{
_clickTimer.Stop();
EnterEditMode();
e.Handled = true;
}
else if (e.ClickCount == 1)
{
_clickTimer.Tag = e; // Сохраняем событие для последующей обработки
_clickTimer.Start();
e.Handled = true; // Предотвращаем немедленную обработку клика
}
}
private void ClickTimer_Tick(object sender, EventArgs e)
{
_clickTimer.Stop();
IsChecked = !IsChecked; // Обрабатываем одиночный клик
}
private void EnterEditMode()
{
Tag = "Editing";
Dispatcher.BeginInvoke(() =>
{
if (GetTemplateChild("textEditor") is TextBox textBox && IsEditing())
{
textBox.Visibility = Visibility.Visible;
textBox.Focus();
textBox.SelectAll();
}
if (GetTemplateChild("contentPresenter") is ContentPresenter cp)
{
cp.Visibility = Visibility.Collapsed;
}
}, DispatcherPriority.Input);
}
private void ExitEditMode()
{
if (!IsEditing()) return;
Tag = null;
if (GetTemplateChild("textEditor") is TextBox textBox)
{
// Принудительно обновляем привязку
var binding = textBox.GetBindingExpression(TextBox.TextProperty);
binding?.UpdateSource();
textBox.Visibility = Visibility.Collapsed;
}
if (GetTemplateChild("contentPresenter") is ContentPresenter cp)
{
cp.Visibility = Visibility.Visible;
}
}
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter || e.Key == Key.Escape)
{
ExitEditMode();
}
}
// Новый метод для обработки потери фокуса
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
ExitEditMode();
}
// Остановка таймера при потере фокуса контролом
private void EditableCheckBox_LostFocus(object sender, RoutedEventArgs e)
{
_clickTimer.Stop();
}
// Вспомогательный метод для проверки состояния
private bool IsEditing() => Tag?.ToString() == "Editing";
}