【发布时间】:2011-08-23 13:07:12
【问题描述】:
当我在我的 WPf DropDown 组合框中选择了一个值项目时,使用左右箭头键进行导航会导致为每个项目触发选定的更改事件。
如何解决这个问题
【问题讨论】:
-
我知道的一种方法 - 是编辑一个包含
ContentPresenter的模板,并将其应用1EventSetter-PreviewKeyDown的样式,并在其中制作一些技巧,例如@ 987654324@ 或类似的东西。
当我在我的 WPf DropDown 组合框中选择了一个值项目时,使用左右箭头键进行导航会导致为每个项目触发选定的更改事件。
如何解决这个问题
【问题讨论】:
ContentPresenter 的模板,并将其应用1 EventSetter - PreviewKeyDown 的样式,并在其中制作一些技巧,例如@ 987654324@ 或类似的东西。
我发现解决这个问题的最简单和最合适的方法如下:
而不是使用我在 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 事件,或者因为我没有使用该事件,所以它不会产生任何问题。
【讨论】:
据我所知,这不可能立即发生。我可以用一种“模拟选择”的方式来实现它。
通过设置 e.Handled = true 在 PreviewKeyDown 事件中处理组合框下拉菜单上的箭头键。这样就不会发生通常的基于导航的选择。
在这些基于键的处理程序中,更改下拉列表中上一项或下一项的Background 和Foreground,使其看起来好像被选中并突出显示。
然后在下拉菜单关闭时选择当前具有“模拟选择背景 - 前景”的项目。下拉关闭后,恢复背景和前景样式。
但这只是我的做法。
【讨论】:
您可以使用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 事件。
这是我尝试过的,可能不是处理此类情况的正确方法
【讨论】: