【发布时间】:2012-04-09 20:07:20
【问题描述】:
我有一些在代码上动态创建的复选框。我确实使用条形码阅读器读取条形码。当我使用条形码时,我试图阻止 Unchecked 和 Checked 事件触发。对于那个效果我:
- 仅当我将焦点放在复选框上时才分配这两个事件,当我失去焦点时我将事件取出。
- 在每个 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);
}
编辑:
刚刚检查了当 CheckBox 没有焦点时没有引发 click 事件。
【问题讨论】:
-
我看不到未注册的事件如何被触发。条形码阅读器是否触发 checkBox_GotFocus 事件?
-
不,没有。我也很困惑。
-
当它触发时,发件人是什么?
-
然后您的条形码“阅读器”似乎以某种方式将焦点放在复选框上并取消选中它们。
-
似乎并非如此。读者只需通过消息中心发送消息。读者根本不知道复选框所在的屏幕确实存在。此外,当屏幕的消息处理程序注册时,复选框不存在。它们仅在收到特定消息后才创建,这不是我在发生奇怪行为时收到的消息。我确实检查过创建复选框的方法没有被调用两次(它不是)。