禁用通过箭头键导航时WPF下拉组合的onselecteindex更改事件

本文关键字:组合 onselecteindex 事件 WPF 导航 | 更新日期: 2023-09-27 18:06:13

当我在WPf下拉组合框中选择了一个值项时,使用左箭头键和右箭头键导航会导致为每个项触发选定的更改事件。

如何克服这个问题

禁用通过箭头键导航时WPF下拉组合的onselecteindex更改事件

我发现克服这个问题最简单、最合适的方法如下:

而不是使用我在DropDownClosed事件上使用的SelectedIndexChanged事件,并且在检查项目是否被选中的if条件下,之前在选定索引内编写的所有代码都被移动到此事件中。这样的。

 private void OnCmbOperatorsListDropDownClosed(object sender, EventArgs e)
        {
            if (cmbOperatorsList.SelectedIndex != -1)
                InsertText(cmbOperatorsList.SelectedValue.ToString()); 
               //Do whatever u want with selected item
        }

这样,当我通过箭头键导航时,SelectedIndexChagned事件将不会触发,或者因为我没有使用该事件,所以它不会产生任何问题

据我所知,这是不可能的。我可以用一种"模拟选择"的方式来实现它。

  1. 通过设置e.Handled = true来处理PreviewKeyDown事件中组合框下拉框上的箭头键。这样通常的基于导航的选择就不会发生了

  2. 在这些基于键的处理程序中,从下拉列表中更改前一项或下一项的BackgroundForeground,使其看起来好像已选中并突出显示。

  3. 当下拉菜单关闭时,选择当前具有"模拟选择背景-前景"的项目。下拉菜单关闭后,恢复背景和前景样式

您可以使用PreviewKeyDown事件

私有void combo_PreviewKeyDown(对象发送者,KeyEventArgs e){

        if (e.Key.Equals(Key.Left) || (e.Key.Equals(Key.Right)))
        {                
           ((ComboBox)sender).SelectionChanged -= combo_SelectionChanged;
        }           
    }

如果你想附加这个事件,你可以添加这个PreviewMouseDown事件。
这是我尝试过的,可能不是处理这种情况的正确方法