防止CheckBox Checked事件被触发

时间:2012-03-26 10:01:19

标签: c# wpf

我在代码上动态创建了一些CheckBox。我确实使用条形码阅读器阅读了条形码。当我使用条形码时,我试图阻止未经检查和已检查的事件被触发。为此,我:

  1. 仅在我关注Checkboxes时分配两个事件,当我失去焦点时,我将事件排除在外。
  2. 在每次Checked和Unchecked事件之后,我将焦点分配给窗口中的另一个控件(因此LostFocus事件被触发)
  3. 但是我使用了条形码阅读器,所有CheckBoxes对象如果被选中则会收到未经检查的事件(但如果未选中它们,则不会收到Checked事件)。

    有没有办法防止这种情况发生?

    使用Unchecked方法的唯一地方是代码show中的那些,在应用程序的代码中没有其他地方。

    指向处理动态创建Checkbox的更好方法的指针不会被忽略。

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

    编辑:

    检查当CheckBox没有焦点时,不会引发click事件。

3 个答案:

答案 0 :(得分:2)

通常对于这类问题,我声明一个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时,下一行将触发选择更改事件。当我这样做它将返回coz标志设置为true;

答案 1 :(得分:0)

尝试在条形码读取之前直接禁用事件处理程序并在之后启用它们,而不是基于失去焦点。像这样:

public void ReadBarcode(ComboBox cmbx)
{
    FieldInfo info = cmbx.GetType().GetField("SelectedIndexChanged", BindingFlags.Instance | BindingFlags.NonPublic);
    if (info != null)
    {
       object obj = info.GetValue(cmbx);
       if (obj is EventHandler)
       {
          EventHandler handler = (EventHandler)obj;
          cmbx.SelectedIndexChanged -= handler;
          //              
          // Perform your bar code reading here.
          // 
          cmbx.SelectedIndexChanged += handler;
       }
    }
}

为了清晰起见,我使用了单个组合框,显然你可以使用相同的技术来组合一组组合框

答案 2 :(得分:0)

我找到了解决方案。我将KeyUp和KeyDown的事件处理程序(条形码输入考虑击键)添加到接收焦点的控件:

e.Handled = true;

并停止了接收它们的复选框。

根据文档,这是一个Bubbling事件。控件和复选框是表兄弟

  • control-&gt; grid 1-&gt; parent grid
  • 复选框 - &gt;网格2-&gt;父网格

我不希望它上升到父网格然后再下来。我需要阅读更多关于WPF的信息。

对我来说有点像黑客。如果有人得到更好的答案,我会标记它。