С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094

Как отключить кнопки при выполнении команды

22.10.2019, 09:56. Показов 4097. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть у меня кнопка, по нажатию на эту кнопку выполняется команда, необходимо запретить повторные нажатие кнопки пока выполняется команда.

View

XML
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
<Window x:Class="DisableButtonWhenMethodWork.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:VM="clr-namespace:DisableButtonWhenMethodWork.ViewModels"
        xmlns:local="clr-namespace:DisableButtonWhenMethodWork"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="400">
    
    <Window.DataContext>
        <VM:MainWindowVM></VM:MainWindowVM>
    </Window.DataContext>
 
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
 
        <DataGrid  Grid.Row="0" Grid.Column="2" Margin="5,5,5,0" 
                  AutoGenerateColumns="False" VerticalAlignment="Top" 
                  ItemsSource="{Binding Numbers}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Номер" Binding="{Binding Path=Value}"/>
            </DataGrid.Columns>
        </DataGrid>
 
        <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Content="Run Method"
                    Command="{Binding RunMethodCommand}">
            </Button>
        </StackPanel>
    </Grid>
</Window>


ViewModel

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class MainWindowVM 
    {
        public ICommand RunMethodCommand { get; }
 
        public ObservableCollection<Number> Numbers { get; set; }
 
        public MainWindowVM()
        {
            RunMethodCommand = new RelayCommand(x => RunMethod());
            Numbers = new ObservableCollection<Number>();
        }
 
        private void RunMethod()
        {
            for(int i = 0; i < 9; i++)
            {
                Numbers.Add(new Number() { Value = i });
                Thread.Sleep(500);
            }
        }
    }


Есть похожая тема на форуме, но там немного не то :
Как отключить кнопки при выполнении операции
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2019, 09:56
Ответы с готовыми решениями:

Как отключить кнопки при выполнении операции
Здравствуйте, знаю что много раз обсуждалось, видел примеры, но не нашел нужного для себя. Суть в том что мне нужно отрубать кнопки через...

DeviceID, получаемые при выполнении команды Get-WmiObject Win32_DiskDrive, присвоить переменной как значение
Из команды Get-WmiObject Win32_DiskDrive нужно занести в переменную значение DeviceID . Подскажите как это можно сделать

Как сделать так, чтобы при выполнении команды PING в файл записывалась только статистика?
Как сделать так, что бы выполнении команды: ping ya.ru -n 10 в файл записывалось только статистика? И не было слова ответ.

7
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
22.10.2019, 10:07
Лучший ответ Сообщение было отмечено Чипс как решение

Решение

Цитата Сообщение от Чипс Посмотреть сообщение
Есть похожая тема на форуме, но там немного не то
И что же там не то, когда там тоже самое?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public bool IsButtonEnabled { get; set; } //Уведомляет через PropertyChanged
 
private void RunMethod()
{
    IsButtonEnabled = false;
    
    Task.Run(async () =>
    {
        for (int i = 0; i < 9; i++)
        {
            Numbers.Add(new Number() { Value = i });
            await Task.Delay(500);
        }
        
        IsButtonEnabled = true;
    });
}
1
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
22.10.2019, 12:05  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
И что же там не то, когда там тоже самое?
Я думал, что надо что-то делать с CanExecute или Execute
Вроде такого
C#
1
2
ConnectToServerCommand = new RelayCommand(x => ConnectToServer(),
                x => IsConnection == false ? true : false);
Получается, если у меня на форме 10 кнопок то мне придётся делать 10 свойств IsButtonEnabled во ViewModel ?

Добавлено через 5 минут
Для чего тогда нужна public event EventHandler CanExecuteChanged; в интерфейсе реализации ICommand ?

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
public class RelayCommand : ICommand
    {
        private readonly Func<object, bool> _canExecute;
        private readonly Action<object> _onExecute;
        private readonly EventHandler _requerySuggested;
 
        /// <summary>Событие извещающее об измении состояния команды</summary>
        public event EventHandler CanExecuteChanged;
 
        /// <summary>Конструктор команды</summary>
        /// <param name="execute">Выполняемый метод команды</param>
        /// <param name="canExecute">Метод разрешающий выполнение команды</param>
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _onExecute = execute;
            _canExecute = canExecute;
 
            _requerySuggested = (o, e) => Invalidate();
            CommandManager.RequerySuggested += _requerySuggested;
        }
 
        public void Invalidate()
            => Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                CanExecuteChanged?.Invoke(this, EventArgs.Empty);
            }), null);
 
        /// <summary>Вызов разрешающего метода команды</summary>
        /// <param name="parameter">Параметр команды</param>
        /// <returns>True - если выполнение команды разрешено</returns>
        public bool CanExecute(object parameter) => _canExecute == null ? true : _canExecute.Invoke(parameter);
 
        /// <summary>Вызов выполняющего метода команды</summary>
        /// <param name="parameter">Параметр команды</param>
        public void Execute(object parameter) => _onExecute?.Invoke(parameter);
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,050
Записей в блоге: 2
22.10.2019, 13:06
Чипс, немного дополню код отnovikov.ea
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
    public class MainWindowVM 
    {
        public RelayCommand RunMethodCommand { get; }
 
        public ObservableCollection<Number> Numbers { get; set; }
 
        public MainWindowVM()
        {
            RunMethodCommand = new RelayCommand(x => RunMethodAsync(), x => RunCanMethod());
            Numbers = new ObservableCollection<Number>();
        }
        private bool IsButtonEnabled = true;
        private bool RunCanMethod() => IsButtonEnabled;
        private async  void RunMethodAsync()
        {
               IsButtonEnabled = false;
               RunMethodCommand. Invalidate ();
              
               await Task. Run (()=> RunMethod());
 
               IsButtonEnabled = true;
               RunMethodCommand. Invalidate ();
        }
 
        private void RunMethod()
        {
            for(int i = 0; i < 9; i++)
            {
                Numbers.Add(new Number() { Value = i });
                Thread.Sleep(500);
            }
        }
    }
Добавлено через 29 минут
Реализация RelayCommand отсюда WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
1
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
22.10.2019, 13:39  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Реализация RelayCommand отсюда
Да, это Ваша реализация. Надеюсь, Вы не против, что я ей пользуюсь. Другой у меня всё ровно нет.
Кстати, она у Вас не обновилась случайно? А то вдруг у меня старая версия

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чипс, немного дополню код отnovikov.ea
ЖЕСТЬ!
Вы очень сильно усложнили простую задачу!

Это вы мне продемонстрировали общепринятый способ потушить кнопку во время выполнения команды?

Добавлено через 2 минуты
C#
1
RunMethodCommand. Invalidate ();
Вот эту строчку не понимаю

Добавлено через 16 минут
Воощем ладно, я понял.
Что бы отключать или включать кнопки на форме придётся сделать отдельные свойства во ViewModel для каждой кнопки, в общем-то я так и хотел сделать, но думал, что есть "красивый" способ.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
22.10.2019, 14:00
Я думал, что надо что-то делать с CanExecute или Execute
Да, это тоже нужно. Просто забыл дописать.
Не обязательно свойство должно быть во вьюмодели. Оно можеть и в модели. Или быть НЕ bool.
Главное, чтобы было некоторое значение, которое мы преобразуем в bool, и событие, уведомляющее о том, CanExecute может измениться
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
22.10.2019, 14:05  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
Да, это тоже нужно. Просто забыл дописать.
Вы меня СОВСЕМ запутали!

Очень прошу, допишите мой код, желательно без асинхронности, мне нужен простой и наглядный пример.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,050
Записей в блоге: 2
22.10.2019, 19:18
Чипс, это общепринятый способ сделать команду не активной.
Если к команде привязана кнопка, то она тоже станет неактивна.

Команда состоит из двух методов.
Исполнительный метод который выполняется при клике.
И разрешающий метод, который возвращает true если выполнение команды разрешено.

Метод Invalidate() введён дополнительно по рекомендации kolorotur для явного уведомления View о необходимости проверки состояния команды. Так как возможны случаи когда View вовремя не проверяет состояние команды, особенно когда состояние меняется из других потоков.

Реализация RelayCommand несколько раз менялась.
Ссылка выше ведёт на пост с последней реализацией RelayCommand.

Добавлено через 15 минут
Чипс, без асинхронности...?!
Тогда, вообще, непонятно что вам нужно.
Раз вы пишите "сделать кнопку не активной на время работы команды", то это уже подразумевает что команда выполняется асинхронно. Так как синхронное выполнение команды "провести" всё окно, и он все будет неактивно пока команда не выполнится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2019, 19:18
Помогаю со студенческими работами здесь

Как отключить выделение кнопки при нажатии?
День всем добрый! Как Вы знаете, при нажатии на кнопку созданную этим кодом: button2 = CreateWindow( WC_BUTTONW, // Класс ...

При каких микрокомандах при выполнении команды WR возможна модификация кэш-памяти
Добрый день, если есть те, кто знают CompModel, то не могли бы вы мне подсказать следующее. При каких микрокомандах при выполнении команды...

Ошибка при выполнении команды bcdboot
При выполнении команды пишет сбой копирования файлов загрузки. Для Вашего вопроса создана отдельная тема. Если хотите получить...

Как отключить кнопки плей и пауза при регулировке громкости?
Всем привет! Подскажите как отключить эти кнопки регулировки громкости. Надоели они пол экрана занимают и долго исчезают. И толку от них...

При выполнении команды INSERT выскакивают ошибки
Курсовая по БД на основе SQL. Создал базу данных, таблицы, прописал значения и свойства полей. Сел разбираться с вводом информации...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru