Страницы

Поиск по вопросам

воскресенье, 14 апреля 2019 г.

WPF Отследить сколько секунд мышь остается на Label

Не знаю как можно реализовать следующие: Когда мышь входит в область label(MouseEnter), если мышь остается в области label 3 секунды, то создается новый контрол. При этом надо сделать так чтобы главный поток не останавливался, а если таймер делать в другом потоке, то надо чтобы этот поток имел возможность создавать элементы на форме(в главном потоке). Если мышь выходит за пределы label и 3 секунды не прошло то ничего не создается соответственно.


Ответ

Всё просто. При заходе мыши в лейбл, делаем 2 задачи: первая закончится через 3 секунды, вторая закончится когда мышь покинет лейбл.
Ждем конца любой из задач. После этого проверяем - если закончилась первая, то добавляем элемент, если вторая - то ничего не делаем.
Все это запускается асинхронно, никаких таймеров не надо.
Пример кода:
class Wnd : Window { public Wnd() { var lbl = new Label() { Content = "I AM LABEL" }; var sp = new StackPanel() {Orientation = Orientation.Vertical}; sp.Children.Add(lbl);
lbl.MouseEnter += async (sender, args) => { var tcs = new TaskCompletionSource();
MouseEventHandler leave = null; leave = (sender2, args2) => { lbl.MouseLeave-=leave; tcs.SetResult(0); };
lbl.MouseLeave+=leave;
var delayTask = Task.Delay(3000); await Task.WhenAny(tcs.Task, delayTask);
if (delayTask.IsCompleted) sp.Children.Add(new Label() {Content="3 sec passed!"}); };
this.Content = sp; } }
В действии:

Комментариев нет:

Отправить комментарий