как сделать неактивной кнопку

WPF
  1. 6 года назад

    Доброго времени суток!
    имеется кнопка.

    <Button x:Name="Establ" Margin="0,2" Style="{DynamicResource DisabledButton}" Width="75.786" FontSize="16" Height="Auto" Command="{Binding SetupVm, Mode=OneWay}" ToolTip="Установка виртуальной машины на ваш компьютер">
    <StackPanel Margin="0">
    <Image Source="Images/setup.ico" Margin="0" Width="40"/>
    <TextBlock TextWrapping="Wrap" Text="Установить" FontSize="12" Margin="0,-7,0,0" />
    </StackPanel>
    </Button>

    на клик по кнопке выполняется действие, его выполнение занимает секунд 7-9 и пользователь за это время может нажать кнопку ещё раз, что приводит к зависанию программы.
    можно ли средствами языка XAML сделать кнопку неактивной на несколько секунд?

    заранее благодарю!

  2. Alexandr_Erohin

    Jun 17 Администратор
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
                // Отключение кнопки
                (sender as Button).IsEnabled = false;
    
                // Длительно выполняющаяся операция, например
                Thread thread = new Thread(SampleMethod);
                thread.Start();
    
                // Включение кнопки
                (sender as Button).IsEnabled = true;
    }
    
    private void SampleMethod()
    {
                this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                    (ThreadStart)delegate()
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(5));
                    }
                );
    }
  3. 5 года назад

    Найти это сообщение Alexandr_Erohin

    Ну это асинхронное выполнение. Возможно ему такое не прокатит. Мало ли что там делается может там контрол заполняется из базы и могут возникнуть исключения с обращением не к тому потоку.

    Найти это сообщение tls tls

    Запусти вместо thread тупо таймер и в обработчике tick выполни enabled=true после определенного времени. Я так понял в XAML нет нормальной задержки. Хотя во время выполнения анимации помоиму ты не можешь пользоваться кнопкой. Попробуй анимацию на кнопку определить (если тебе такой вариант подходит).

  4. Вариантов много 1) использовать interlocked - т.е. если один процесс выполняется, игнорировать нажатие, и пускай себе хоть 300 раз кликает :)
    2) Можно вместо button истпользовать togglebutton (в стилях для нажатого состояния делать ее дизейблнутой) так кнопку после нажатия нельзя будет нажать снова, а отжать ее можно после того как ваш процесс окончится, через использование диспетчера. На скорую руку я бы сделал так
    3)и наконец мой "самый любимый вариант" - использовать bakgroundworker запускать его при нажатии на кнопку, дизейблить ее, а по окончании его работы раздизейблить
    Сорри, что без кода, но все можно прогуглить на stackoverflow

или зарегистрируйтесь чтобы ответить