Отключение всего выполнения на определенный период времени - PullRequest
1 голос
/ 02 апреля 2012

Мне нужно отключить любое выполнение любого события (клика) на некоторое время после нажатия кнопки.В этот конкретный период, независимо от того, сколько кнопок я нажимаю, функции кнопок не будут выполняться.Я не могу использовать Thread.Sleep(), потому что он только задерживает выполнение, функция кнопки все еще выполняется.Может ли any1 помочь?Мой код здесь:

int delay = 2000; //unusable as it is just delaying the execution of clicked button.
public void PressCOM(string key)
    {
        if (key == "PressSc")
        { 
            PressAndRelease(key);
            PressAndRelease("C");

            Thread.Sleep(delay);
        }

Ответы [ 4 ]

4 голосов
/ 02 апреля 2012

Спать в главном потоке все равно плохая идея.

Вам нужно будет встроить некоторую логику, касающуюся кнопок:

  • отключить их
  • игнорировать щелчки

ИспользоватьЛогическое свойство, которое сбрасывается таймером.

2 голосов
/ 02 апреля 2012

Не совсем понятно, что вы хотите сделать.

Не очень хорошая идея, чтобы заснуть в главном потоке приложений.Это сделает ваше приложение невосприимчивым ко всем сообщениям Windows (как исходящим от пользователя, так и самой Windows).Ваши пользователи заполнят его повешенным.

Если вам нужно отключить только эту кнопку, вы можете установить для ее свойства IsEnabled значение false, пользователь не сможет щелкнуть ее.

Если вы хотите отключить все события, вы можете использовать свойство IsEnabled самого окна.

Если отключить все элементы управления (или только одну кнопку), нетэто не правильное решение для вас, тогда вы можете использовать одно из следующих действий:

Добавить переменную state (или простой флаг).Во всех ваших обработчиках событий вы будете проверять, является ли эта переменная истинной или нет (вы измените ее с помощью таймера).Что-то вроде:

if (!_canHandleMouseClicks)
   return false;

Отключить все кнопки и повторно включить их через некоторое время:

private static IEnumerable<Button> FindAllButtons(DependencyObject obj)
{
    if (obj == null)
        return null;

    int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
    for (int i = 0; i < childrenCount; ++i)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);

        if (child != null && child is Button)
            yield return (Button)child;

        // If you may have buttons inside buttons then uncomment these lines
        //foreach (Button childOfChild in FindAllButtons(child))
        //    yield return childOfChild;
    }
}

Затем вы можете написать:

foreach (Button button in FindAllButtons(window))
    button.IsEnabled = false; // true to re-enable
2 голосов
/ 02 апреля 2012

Отключение и отображение сообщения типа «Пожалуйста, подождите ...» для пользователя будет лучшим вариантом ...

Вы можете отключить и включить панели. Сетки в WPF, как вам нравится

Я обычно использую Adorner Overlay (полупрозрачный) с сообщением, чтобы помешать пользователю взаимодействовать с пользовательским интерфейсом ... обычно работник Backround помогает при необходимости показать и скрыть оверлей.

Это будет хорошая реализация Artice для Adorner в XAml

надеюсь, это поможет ..:)

0 голосов
/ 02 апреля 2012

Возможное решение может состоять в том, чтобы показать диалоговое окно и скрыть диалоговые окна, кнопки отмены и закрытия. Это предотвратит нажатие любой кнопки в главном окне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...