2010-07-22 48 views
6

我有一组WPF CheckBox,它们有一个Checked事件处理程序,当用户点击其中一个时处理某些逻辑。但是,我也有一个“全部清除”按钮,点击后,将清除所有复选框。如果用户点击“全部清除”按钮,我不希望复选框触发他们的Checked事件。有没有办法做到这一点?有没有办法阻止WPF CheckBox触发Checked事件?

+0

我相信你的意思是Unchecked event right? – 2010-07-22 03:16:00

+0

对不起,Unchecked事件。 – 2010-07-22 03:33:00

回答

4

在清除在的开头删除的事件处理程序的所有按钮的事件处理程序,然后在全部清除按钮的事件处理结束重新添加事件处理程序。

这里是一个肮脏的样本:

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> 

代码隐藏

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

谢谢,这个解决方案似乎有点破解,但可能是最好的方法。另一个可行的解决方案是由Jeff提供的解决方案,以创建一个变量,检查是否应该处理'Checked'逻辑。 – 2010-08-27 01:58:26

1

这将是理想的禁用事件,但我不知道如何做到这一点。

尽管如果按下“全部清除”按钮,添加布尔值以跟踪布尔值将会很容易。然后,只有通过按钮不选中时才执行未经检查的代码。

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

这是一个可行的解决方案,但我想阻止必要时创建另一个变量。 – 2010-08-27 01:56:53

18

您可以使用,而不是 '托运' 的 '点击' 事件或“未选中'事件。

'单击'将确保状态更改将来自用户输入(例如通过鼠标按钮或空格键)。

而像cb.IsChecked = value这样的操作不会触发'点击'事件。

+0

差点忘了!它可能实际上解决了我的问题,谢谢! – Enrico 2013-05-08 14:12:07

+0

只是一个警告,如果使用空格键也不会触发,这也可以切换复选框输入。 – 2017-02-09 15:42:54

相关问题