在导航箭头键时禁用WPF下拉组合的SelectedIndexchanged事件

时间:2011-08-22 10:10:22

标签: c# .net wpf

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

如何克服这个问题

3 个答案:

答案 0 :(得分:2)

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

而不是使用我在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 :(得分:1)

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

  1. 通过设置e.Handled = true,在PreviewKeyDown事件中处理组合框下拉列表上的箭头键。因此通常的导航选择不会发生。

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

  3. 然后在下拉关闭时执行选择具有“模拟选择背景 - 前景”的项目。下拉关闭后,还原背景和前景样式。

  4. 但这只是我的做法。

答案 2 :(得分:1)

您可以使用PreviewKeyDown事件,例如

  

private void combo_PreviewKeyDown(object sender,KeyEventArgs e)           {

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

        }           
    }

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