Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 812
1
.NET 4.x

WPF блокирование кнопки сразу же после нажатия

21.07.2016, 12:12. Показов 3903. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста как сделать кнопку не активной сразу же после нажатия, и до тех пор пока функция не выполнится полностью. Чтобы избежать момента когда быстро 2-3 раза нажимаешь на задумавшуюся кнопку.

Как вариант сразу же поставить в функции сразу же в начале IsEnabled="False"
Но чето кажется это не спасет от двойного клика
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2016, 12:12
Ответы с готовыми решениями:

Воспроизведение музыки из интернета сразу после нажатия кнопки
Для воспроизведения песни в браузере использую GET запрос к сервису. Браузер, в частности гугл...

Нужно после нажатия кнопки сразу же на странице обновить данные
Покажите на простом примере, нужен статус почти как у Дурова. Надеюсь все знают о статусе в ВК....

Блокирование кнопки после использования
Здравствуйте! У меня есть программа, которая выполняется при входе в систему....

Не запускается комп: индикатор возле кнопки Пуск на системнике зажегся только во время нажатия кнопки. После - не горит.
Просьба к форумчанам помочь в решении проблеммы. Сегодня вдруг отрубился комп во время работы. Если...

3
Заблокирован
21.07.2016, 12:29 2
Цитата Сообщение от КВА696 Посмотреть сообщение
Как вариант сразу же поставить в функции сразу же в начале IsEnabled="False"
КВА696, все правильно, а после выполнения - обратно. Функция, надеюсь, асинхронная?
1
В поиске
103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 812
21.07.2016, 14:03  [ТС] 3
Ev_Hyper, Видимо я чето делаю не так так как все равно даже не работает

XML
1
<Button Content="Кнопка"  Command="{Binding Поиск}" IsEnabled="{Binding СостояниеКнопки, Mode=TwoWay}"/>
C#
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
        public bool СостояниеКнопки { get; set; } = true;
 
        /*Кнопка создания*/
        private ICommand _Поиск;
        public ICommand Поиск
        {
            get
            {
                return _Поиск ?? (_Поиск = new RelayCommand<object>(a =>
                {
                    
                    Thread t = new Thread(WriteY);
                    t.Start();
 
 
                    Thread.Sleep(2000);
 
 
                    t = new Thread(Write);
                    t.Start();
 
                    
 
                }, a => 
                {
                    return //Условие на блокировку кнопки если текстбокс пустой;
                }));
            }
        }
        #endregion Поиск продукции
 
        void WriteY()
        {
            СостояниеКнопки = false; RaisePropertyChanged(nameof(СостояниеКнопки));
        }
        void Write()
        {
            СостояниеКнопки = true; RaisePropertyChanged(nameof(СостояниеКнопки));
        }
Если сделать так то по нажатию она заблокируется а при верхнем случае нет

C#
1
2
3
4
5
6
7
8
9
10
                return _Поиск ?? (_Поиск = new RelayCommand<object>(a =>
                {
                    
                    Thread t = new Thread(WriteY);
                    t.Start();                    
 
                }, a => 
                {
                    return //Условие на блокировку кнопки если текстбокс пустой;
                }));
0
271 / 238 / 102
Регистрация: 26.10.2012
Сообщений: 725
22.07.2016, 09:51 4
Итак, что происходит:
-Изменение элементов Wpf (в частности этой кнопки) возможно только в том потоке, в котором они созданы.
В частности, автоматическая привязка данных требует свободного основном потока.
-Вызвав Thread.Sleep(2000) в основном потоке, вы заняли его, тем самым сделав невозможным взаимодействие с его кнопкой: 2 секунды привязка данных невозможна, т.к. основной поток "занят"

Это легко можно обойти если перенести ожидание Thread.Sleep в поток свободный от привязки данных
C#
1
2
3
4
5
void Write()
        {
            Thread.Sleep(2000);
            СостояниеКнопки = true; OnPropertyChanged("СостояниеКнопки");
        }
Но это не нормальное решение. По-нормальному это делается так
Цитата Сообщение от КВА696 Посмотреть сообщение
Как вариант сразу же поставить в функции сразу же в начале IsEnabled="False"
Или, раз используются комманды, у комманд есть свойство CanExecute, которое автоматически задает Enabled для привязанных элементов.
1
22.07.2016, 09:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2016, 09:51
Помогаю со студенческими работами здесь

Анимация в 2D срабатывает не сразу после нажатия клавиши
Привет, Я только начал знакомиться с 2D анимацией в Unity. Проблема в том, что анимация...

Сразу после нажатия Power вызывается OnCreate. Почему?
Здравствуйте. Пишу вообще под Mono.Android, но в той ветке глухо, да и код очень похож на Java, так...

Рисование диаграммы в PaintBox сразу после нажатия на кнопку
нужно чтобы при нажатии на Button1 сразу вылазила диаграмма в PaintBox unit Unit1; interface...

Поиск записи в ADOQuery после ввода в DBEdit и после нажатия кнопки
На форме расположены DBEdit, DBGrid, ADOQuery, DataSource и Button. В ADOQuery прописан следующий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru