Предотвратить CheckBox Checked событие от запуска - PullRequest
2 голосов
/ 26 марта 2012

У меня есть несколько CheckBox, созданных динамически в коде.Я читаю штрих-код, используя считыватель штрих-кода.Я пытаюсь остановить запуск событий Unchecked и Checked при использовании штрих-кода.Для этого эффекта я:

  1. назначаю оба события только тогда, когда я фокусируюсь на флажках, а когда я теряю фокус, я убираю события.
  2. после каждого события Проверено и Не проверено, я назначаю фокус другому элементу управления в окне (таким образом, событие 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);
    }
    

    РЕДАКТИРОВАТЬ:

    Только что проверил, что событие click не возникает, когда CheckBox не имеет фокуса.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

Обычно для такого рода проблем я объявляю флаг 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....
}

Когда я назначил флаг = true, следующая строка будет вызывать событие изменения выбора. когда я это сделаю, будет возвращен флаг coz установлен в true;

0 голосов
/ 27 марта 2012

Я нашел решение.Я добавил обработчики событий для KeyUp и KeyDown (ввод штрих-кода учитывает нажатия клавиш) к элементу управления, который получал фокус с:

e.Handled = true;

, и это остановило флажки, получающие их.

Согласно документации, это событие Bubbling.И контрольные и флажки - двоюродные братья

  • control-> grid 1-> parent grid
  • checkbox-> grid 2-> parent grid

Я бы не ожидал, что он поднимется до родительской сетки, а затем вниз.Мне нужно больше узнать о WPF.

Мне кажется, это немного взломать.Если кто-то получит лучший ответ, я отмечу его.

0 голосов
/ 26 марта 2012

Вместо того, чтобы терять фокус, попробуйте отключить обработчики событий непосредственно перед считыванием штрих-кода, а затем включить их.Примерно так:

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

Я использовал один комбинированный список для ясности, очевидно, вы можете использовать ту же технику для множества комбинированных списков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...