有没有办法防止WPF复选框触发其选中事件?

有没有办法防止WPF复选框触发其选中事件?,wpf,events,event-handling,checkbox,Wpf,Events,Event Handling,Checkbox,我有一组WPF复选框,其中有一个选中的事件处理程序,当用户单击其中一个复选框时,它会处理一些逻辑。但是,我还有一个“全部清除”按钮,单击该按钮时,将清除所有复选框。如果用户单击“全部清除”按钮,我不希望复选框触发其选中事件。有没有办法做到这一点?最好禁用该事件,但我不知道如何做到 尽管如果“全部清除”按钮是否被按下,添加一个布尔值来跟踪也同样容易。然后,仅在未通过按钮取消选中的情况下才执行未选中的代码 private bool clearAllClicked = false; private

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

最好禁用该事件,但我不知道如何做到

尽管如果“全部清除”按钮是否被按下,添加一个布尔值来跟踪也同样容易。然后,仅在未通过按钮取消选中的情况下才执行未选中的代码

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

在“全部清除”按钮的事件处理程序中删除事件处理程序开头的事件处理程序,然后在“全部清除”按钮的事件处理程序末尾重新添加事件处理程序

这是一个脏样本:

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>

复选框1
复选框2
复选框3
全部取消选中
代码隐藏

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;
        }
    }
}
使用系统;
使用System.Windows;
命名空间未选中测试
{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
私有int i=1;
公共窗口1()
{
初始化组件();
}
无效复选框3\u未选中(对象发送方,路由目标e)
{
textBox1.Text=i++.ToString()+”。复选框3未选中。“+Environment.NewLine+textBox1.Text;
}
无效复选框2\u未选中(对象发送器,路由目标e)
{
textBox1.Text=i++.ToString()+”。复选框2未选中。“+Environment.NewLine+textBox1.Text;
}
无效复选框1\u未选中(对象发送方,路由目标e)
{
textBox1.Text=i++.ToString()+”。复选框1未选中。“+Environment.NewLine+textBox1.Text;
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
checkBox1.Unchecked-=checkBox1_Unchecked;
checkBox2.Unchecked-=checkBox2_Unchecked;
checkBox3.Unchecked-=checkBox3\u Unchecked;
checkBox1.IsChecked=false;
checkBox2.IsChecked=false;
checkBox3.IsChecked=false;
checkBox1.Unchecked+=checkBox1_Unchecked;
checkBox2.Unchecked+=checkBox2_Unchecked;
checkBox3.Unchecked+=checkBox3\u Unchecked;
}
}
}

您可以使用“单击”事件,而不是“选中”或“未选中”事件

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


cb.IsChecked=value
这样的操作不会触发“Click”事件。

我相信你指的是未检查的事件,对吗?对,对不起,未检查的事件。这是一个可行的解决方案,但如果可能的话,我想避免创建另一个变量。谢谢,这个解决方案似乎有点不太成熟,但可能是最好的方法。另一个可行的解决方案是Jeff提供的,创建一个变量,检查它是否应该处理
checked
逻辑。几乎忘了这一点!这可能会解决我的问题,谢谢!只是一个警告,如果使用空格键也可以切换复选框输入,则不会触发。