我在代码上动态创建了一些CheckBox。我确实使用条形码阅读器阅读了条形码。当我使用条形码时,我试图阻止未经检查和已检查的事件被触发。为此,我:
但是我使用了条形码阅读器,所有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事件。
答案 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事件。控件和复选框是表兄弟
我不希望它上升到父网格然后再下来。我需要阅读更多关于WPF的信息。
对我来说有点像黑客。如果有人得到更好的答案,我会标记它。