c# - 防止触发 CheckBox Checked 事件

标签 c# wpf

我有一些在代码上动态创建的复选框。我确实使用条形码阅读器读取条形码。当我使用条形码时,我试图阻止触发 Unchecked 和 Checked 事件。为了达到这种效果,我:

  1. 仅当我将焦点放在复选框上时才分配这两个事件,当我失去焦点时,我将取出事件。
  2. 在每个 Checked 和 Unchecked 事件之后,我将焦点分配给窗口中的另一个控件(因此会触发 LostFocus 事件)

但是如果我使用条形码阅读器,所有 CheckBoxes 对象如果被选中,都会收到 Unchecked 事件(但如果未选中,则不会收到 Checked 事件)。

有没有办法避免这种情况发生?

唯一使用 Unchecked 方法的地方是代码显示中的地方,而不是应用程序代码中的其他地方。

指向处理这种动态创建复选框的更好方法的指针将不会被忽视。

private void SomeMethod ()
{
  foreach (KeyValuePair<String, String> kvp in someDictionary)
  {
    CheckBox checkBox = new CheckBox();
    checkBox.Content = kvp.Key;
    checkBox.GotFocus +=new RoutedEventHandler(checkBox_GotFocus);
    checkBox.LostFocus += new RoutedEventHandler(checkBox_LostFocus);
    checkBox.ClickMode = ClickMode.Release;
    Grid.SetRow(checkBox, fileSelectionGrid.RowDefinitions.Count);
    fileSelectionGrid.Children.Add(checkBox);
    RowDefinition row = new RowDefinition();
    fileSelectionGrid.RowDefinitions.Add(row);
  }
}

void checkBox_LostFocus(object sender, RoutedEventArgs e)
{
  CheckBox checkBox = sender as CheckBox;
  checkBox.Checked -= new RoutedEventHandler(checkBox_Checked);
  checkBox.Unchecked -= new RoutedEventHandler(checkBox_Unchecked);
}

void checkBox_GotFocus(object sender, RoutedEventArgs e)
{
  CheckBox checkBox = sender as CheckBox;
  checkBox.Checked += new RoutedEventHandler(checkBox_Checked);
  checkBox.Unchecked += new RoutedEventHandler(checkBox_Unchecked);
}

编辑:

刚刚检查了当复选框没有焦点时不会引发点击事件。

最佳答案

通常对于此类问题,我声明一个 bool 标志,该标志在将触发事件的代码行之前和之后分配值,并且当该事件被触发时,它所做的第一件事就是检查该标志值。

例如

bool flag = false;

private void SomeMethod()
{
  flag = true;
  YourCheckBox.checked = false;
  flag = false;
}

void YourCheckBox_Checked(object sender, RoutedEventArgs e)
{
  if (flag)
     return;

  // Do something....
}

void YourCheckBox_UnChecked(object sender, RoutedEventArgs e)
{
  if (flag)
     return;

  // Do something....
}

当我指定 flag = true 时,下一行将触发选择更改事件。当我这样做时,它将返回,因为标志设置为 true;

关于c# - 防止触发 CheckBox Checked 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870124/

相关文章:

c# - 基于CompareExchange的互锁实现是否应该使用SpinWait?

c# - Visual Studio 2010 EXE 打包

c# - 如何单击 ListView 项中的按钮?

WPF、应用程序设计建议和数据库并发

c# - 反正有没有使用 WPF 为 android 开发应用程序?

c# - 使用列表项内容作为字符串名称

c# - 如何在 MVC Razor 的 HTML.TextAreaFor 文本中显示链接?

c# - 如何以编程方式将单击事件添加到 FrameworkElementFactory

c# - 如何从绝对uri加载窗口?

WPF 可编辑组合框 IsFocused 问题