2011-01-14 6 views
2

J'ai une méthode qui désactive tous les boutons sur ma fenêtre. Mais je ne peux pas sembler obtenir le type de bouton pour le faire correspondre à la collecte des ressourcesComment désactiver tous les boutons

J'utilise Expression Blend 3 avec le code-behind 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; 
      } 
     } 

    } 

Mise à jour

Merci pour les réponses! Ok La boucle fonctionne mais mon code est incorrect. this.Resources Ne semble pas inclure mes boutons! Cela pourrait être un mélange chose?

Alors oui. J'ai fini par le faire manuellement. Parce que je suis pressé et qu'il n'y a pas une solution courte et facile. Merci pour toute la contribution si!

Répondre

2

Il est possible que j'ai mal compris quelque chose, mais vous essayez de trouver des boutons CONTENUS dans votre fenêtre dans les RESSOURCES de votre fenêtre? Parce que ces deux choses sont des choses différentes.
Si c'est le cas, essayez de définir ceci.IsEnabled = false (mais cela désactive d'autres choses, pas seulement les boutons), ou traversez l'arborescence logique (ou l'arborescence visuelle si silverlight) avec LogicalTreeHelper/VisualTreeHelper, bien que ce soit TRÈS méthode coûteuse.
Solution manuelle consiste à donner des noms à tous vos boutons, faire une liste d'entre eux dans codebehind et itérer cette liste.

Cependant le mieux serait de créer une propriété booléenne appelée AreButtonsEnabled dans votre ViewModel (si vous ne l'utilisez MVVM que simplement sur le contrôle lui-même - mais en faire DependencyProperty) et de lier tous les biens IsEnabled de votre bouton pour les ! Et puis dans codebehind, mettez simplement ce booléen à faux ... et la magie s'ensuit.

Si ce n'est pas votre cas alors désolé j'ai perdu votre temps.

+0

C'est le cas, et le vôtre est une idée intéressante. Je vais essayer ça. –

0

qu'en pensez-vous?

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

ou mieux encore

if (this.Resources[i] is Button)) 
4
void DisableButtons() 
{ 
    for(int i = 0; i < Resources.Count; i ++) 
    { 
     var btn = Resources[i] as Button; 
     if(btn != null) 
     { 
      btn.IsEnabled = false; 
     } 
    } 
} 

moyen facile de mettre en œuvre est l'utilisation de l'instruction foreach avec requête LINQ, mais cette façon plus besoin resuources Whan facile pour.

void DisableButtons() 
{ 
    foreach(var button in Resources.OfType<Button>()) 
    { 
     button.IsEnabled = false; 
    } 
} 
0

Il semble que votre instruction de boucle soit erronée. i>= this.Resources.Count -1 devrait être i <= this.Resources.Count - 1; Il ne sera jamais entrer dans votre boucle.

En outre, c'est juste une chose de style, mais je voudrais le réécrire comme:

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; 
     } 
    } 
0

Qu'en est-ce?

if (this.Resources[i] is Button) 

De cette façon, vous pouvez obtenir tout ce qui hérite de Button.

0

J'utilise une méthode simple. D'abord, créez un booléen.

bool enableButtons = true; 

Maintenant j'ajoute un temporisateur au formulaire qui est actif tout le temps.

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

Alors chaque fois que je veux désactiver les boutons, je viens de changer enableButtons false.

Questions connexes