2010-07-22 2 views
6

J'ai un groupe de CheckBox WPF qui ont un gestionnaire d'événements Checked qui gère une certaine logique lorsque l'utilisateur clique sur l'un d'entre eux. Cependant, j'ai aussi un bouton "Effacer tout" qui, lorsqu'on clique dessus, effacera toutes les cases à cocher. Si l'utilisateur clique sur le bouton "Effacer tout", je ne veux pas que les cases à cocher déclenchent leur événement Checked. Y-a-t'il une façon de le faire?Est-il possible d'empêcher un WPF CheckBox de déclencher son événement Checked?

+0

Je crois que vous voulez dire événement non contrôlé, n'est-ce pas? –

+0

Désolé, l'événement Décoché. –

Répondre

4

Retirez le gestionnaire d'événements au début du dans le gestionnaire d'événements de bouton All Clear et puis ajoutez le gestionnaire d'événements à la fin du gestionnaire d'événements de bouton All Clear.

est ici un échantillon sale:

XAML

<Window x:Class="UncheckedTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <CheckBox Height="16" Margin="22,30,136,0" Name="checkBox1" VerticalAlignment="Top" 
        Unchecked="checkBox1_Unchecked">CheckBox 1</CheckBox> 
     <CheckBox Height="16" Margin="22,76,136,0" Name="checkBox2" VerticalAlignment="Top" 
        Unchecked="checkBox2_Unchecked">CheckBox 2</CheckBox> 
     <CheckBox Margin="22,0,136,121" Name="checkBox3" Height="16" VerticalAlignment="Bottom" 
        Unchecked="checkBox3_Unchecked">CheckBox 3</CheckBox> 
     <Button HorizontalAlignment="Right" Margin="0,118,37,121" Name="button1" Width="87" 
       Click="button1_Click">Uncheck All</Button> 
     <TextBox Height="74" Margin="22,0,20,13" Name="textBox1" VerticalAlignment="Bottom" 
       TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" /> 
    </Grid> 
</Window> 

code Derrière

using System; 
using System.Windows; 

namespace UncheckedTest 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private int i = 1; 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     void checkBox3_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 3 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox2_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 2 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     void checkBox1_Unchecked(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = i++.ToString() + ". Checkbox 1 Unchecked." + Environment.NewLine + textBox1.Text; 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      checkBox1.Unchecked -= checkBox1_Unchecked; 
      checkBox2.Unchecked -= checkBox2_Unchecked; 
      checkBox3.Unchecked -= checkBox3_Unchecked; 

      checkBox1.IsChecked = false; 
      checkBox2.IsChecked = false; 
      checkBox3.IsChecked = false; 

      checkBox1.Unchecked += checkBox1_Unchecked; 
      checkBox2.Unchecked += checkBox2_Unchecked; 
      checkBox3.Unchecked += checkBox3_Unchecked; 
     } 
    } 
} 
+2

Merci, cette solution semble un peu hack-ish mais c'est probablement la meilleure solution. Une autre solution viable est celle fournie par Jeff, pour créer une variable qui est vérifiée pour voir si elle devrait traiter la logique 'Checked'. –

1

Il serait idéal de désactiver l'événement mais je ne sais pas comment cela serait fait.

Bien qu'il soit aussi facile d'ajouter un booléen pour garder la trace si le bouton "Effacer tout" a été pressé ou non. Ensuite, ne faites que le code non coché s'il n'a pas été décoché par le bouton.

private bool clearAllClicked = false; 

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    clearAllClicked = true; 
    checkbox.IsChecked = false; 
    clearAllClicked = false; 
} 

private void checkbox_Unchecked(object sender, RoutedEventArgs e) 
{ 
    if (!clearAllClicked) 
    { 
     //do stuff 
    } 
} 
+0

Ceci est une solution viable, mais je voudrais éviter de devoir créer une autre variable si possible. –

18

Vous pouvez utiliser l'événement 'Cliquez' au lieu de 'checked' ou « Non vérifiée ' événements. 'Click' s'assurera que le changement d'état proviendra de l'entrée de l'utilisateur (via le bouton de la souris ou la barre d'espace par exemple)

Et des opérations comme cb.IsChecked = value ne déclencheront pas l'événement 'Clic'.

+0

Presque oublié à ce sujet! Cela pourrait résoudre mon problème, merci! – Enrico

+0

Juste un avertissement, Cela ne se déclenche pas si la barre d'espace est utilisée et peut également basculer l'entrée de la case à cocher. –

Questions connexes