Как отключить все кнопки - PullRequest
2 голосов
/ 14 января 2011

У меня есть метод, который отключает все кнопки в моем окне.Но мне кажется, что тип кнопки не соответствует типу коллекции ресурсов

. Я использую Expression Blend 3 с кодом AC # позади

void DisableButtons()
    {
        for(int i = 0; i>= this.Resources.Count -1; i ++)
        {
            if (this.Resources[i].GetType() == typeof(Button))
            {
                Button btn = (Button)this.Resources[i];
                btn.IsEnabled = false;
            }
        }

    }

Обновление

Спасибо за ответы!Хорошо, цикл работает, но мой код неверен.this.Resources Кажется, не включает мои кнопки!Это может быть Смесь вещь?

Так что да.Я закончил делать это вручную.Потому что я тороплюсь, и нет простого решения.Спасибо за все вклад, хотя!

Ответы [ 6 ]

5 голосов
/ 14 января 2011
void DisableButtons()
{
    for(int i = 0; i < Resources.Count; i ++)
    {
        var btn = Resources[i] as Button;
        if(btn != null)
        {
            btn.IsEnabled = false;
        }
    }
}

Простой способ реализовать это - использовать инструкцию foreach с запросом LINQ, но для этого требуется больше ресурсов, чем просто.

void DisableButtons()
{
    foreach(var button in Resources.OfType<Button>())
    {
        button.IsEnabled = false;
    }
}
2 голосов
/ 14 января 2011

Возможно, я что-то неправильно понял, но вы пытаетесь найти Кнопки, СОДЕРЖАЩИЕСЯ в вашем окне, в РЕСУРСАХ вашего окна? Потому что эти две вещи совершенно разные.
Если это так, либо попробуйте установить this.IsEnabled = false (но это отключает другие вещи, а не только кнопки), либо просмотрите логическое дерево (или визуальное дерево, если silverlight) с LogicalTreeHelper / VisualTreeHelper, хотя это ОЧЕНЬ дорогой метод .
Обходной путь вручную - дать имена всем вашим кнопкам, составить список из них в коде и повторить этот список.

Однако лучше всего было бы создать логическое свойство AreButtonsEnabled в вашей ViewModel (если вы не используете MVVM, а не просто на самом элементе управления, но сделайте его DependencyProperty) и связать IsEnabled всех ваших кнопок. собственность им! А затем в codebehind просто установите это логическое значение на false ... и волшебство наступит.

Если это не ваш случай, извините, я потратил ваше время впустую.

1 голос
/ 04 августа 2017

Я использую простой метод. Сначала вы создаете bool.

bool enableButtons = true;

Теперь я добавляю в форму таймер, который постоянно активен.

private void timer1_Tick(object sender, EventArgs e)
{
 if (enableButtons = false)
 {
     button1.Enabled = false;
     button2.Enabled = false;
 }
 else
 {
     button1.Enabled = true;
     button2.Enabled = true;
 }
}

Поэтому, когда я хочу отключить кнопки, я просто заменяю enableButtons на false.

1 голос
/ 14 января 2011

Как насчет этого?

if (this.Resources[i] is Button)

Таким образом, вы можете получить все, что наследует от Button.

1 голос
/ 14 января 2011

Похоже, ваш оператор цикла неверен. i>= this.Resources.Count -1 должно быть i <= this.Resources.Count - 1; Оно никогда не попадет в ваш цикл.

Кроме того, это просто стиль, но я бы переписал его как:

    for(int i = 0; i < Resources.Count; i ++)
    {
        Button btn = Resources[i] as Button; // btn will be null if not a Button

        if( btn != null )
        {
            btn.IsEnabled = false;
        }
    }
1 голос
/ 14 января 2011

что по этому поводу?

if (this.Resources[i].GetType() == typeof(Button)))

или даже лучше

if (this.Resources[i] is Button))
...