当我在WPf DropDown组合框中选择了一个值项目时,使用键导航左右箭头键会导致为每个项目触发选定的已更改事件。
如何克服这个问题
答案 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)
据我所知,这是不可能的。我可以用一种“选择模拟”的方式实现这一点。
通过设置e.Handled = true
,在PreviewKeyDown事件中处理组合框下拉列表上的箭头键。因此通常的导航选择不会发生。
基于键的Inthese处理程序,从下拉列表中更改上一个或下一个项目的Background
和Foreground
,以使其看起来好像已选中并突出显示。
然后在下拉关闭时执行选择具有“模拟选择背景 - 前景”的项目。下拉关闭后,还原背景和前景样式。
但这只是我的做法。
答案 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
事件
这是我尝试过的,可能不是做这种情况的正确方法