捕获输入事件

时间:2017-11-17 12:58:04

标签: c# wpf events

我有一个TextBoxComboBoxCheckBox的表单,这些表单是从函数填充的(例如textbox.text = "newValue";)。

private void updateIdentite(Contact c, Dal dal)
{
    Identite id = dal.GetIdentite(c);
    if (id != null)
    {
        idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
        ...
        idNom.Text = id.pers_nom;//example of a TextBox
        ...
        idAi.IsChecked = (id.cont_drap_ai == "1");//example of a CheckBox
        ...
    }
}

我需要在用户手动编辑项目时捕获事件,但使用TextChangedSelectionChangedChecked时,表单填充时也会触发这些事件上一个功能。

foreach (object item in identiteGrid.Children)
{
    TextBox tb = item as TextBox;
    if (tb != null)
    {
        tb.TextChanged += new TextChangedEventHandler(idTextBox_TextChanged);
        continue;
    }
    ComboBox droplist = item as ComboBox;
    if (droplist != null)
    {
        droplist.SelectionChanged += new SelectionChangedEventHandler(idCombobox_SelectionChanged);
        continue;
    }
    CheckBox cb = item as CheckBox;
    if (cb != null)
    {
        cb.Checked += new RoutedEventHandler(idCheckbox_Checked);
        continue;
    } 
}

有没有办法捕获这些控件的“onInput”事件?

由于

2 个答案:

答案 0 :(得分:1)

抓取用户输入

考虑使用:Control.OnKeyDown方法。

为了让用户输入 ,他必须专注于控件并点击一些键。

此外,如果您想完全覆盖,您还可以在控件上挂钩Control.MouseClick事件......

详细了解这些事件。

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.onkeydown(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseclick(v=vs.110).aspx

答案 1 :(得分:1)

您可以连接事件处理程序,即执行foreach循环, 之后设置初始值。

或者您可以在以编程方式设置值之前暂时取消挂起事件处理程序:

private void updateIdentite(Contact c, Dal dal)
{
    Identite id = dal.GetIdentite(c);
    if (id != null)
    {
        idCivilite.SelectionChanged -= idCombobox_SelectionChanged;
        idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
        idCivilite.SelectionChanged += idCombobox_SelectionChanged;

        tb.TextChanged -= idTextBox_TextChanged;
        idNom.Text = id.pers_nom;//example of a TextBox
        tb.TextChanged += idTextBox_TextChanged;

        idAi.Checked -= idCheckbox_Checked;
        idAi.IsChecked = (id.cont_drap_ai == "1");//example of a CheckBox
        idAi.Checked += idCheckbox_Checked;
    }
}

或者您可以使用布尔标志来防止事件处理程序中的代码在特定情况下运行:

private bool handleSelectionChanged = true;
private void updateIdentite(Contact c, Dal dal)
{
    ...
    handleSelectionChanged = false;
    idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
    handleSelectionChanged = true;
    ...
}

private void idCombobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (!handleSelectionChanged)
        return;

    //your code...
}