2010-07-22 596 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

相關問題