【问题标题】:Disabling the onSelectedIndex changed event of WPF dropdown combo on navigating through arrrow keys在通过箭头键导航时禁用 WPF 下拉组合的 onSelectedIndexchanged 事件
【发布时间】:2011-08-23 13:07:12
【问题描述】:

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

如何解决这个问题

【问题讨论】:

  • 我知道的一种方法 - 是编辑一个包含ContentPresenter 的模板,并将其应用1 EventSetter - PreviewKeyDown 的样式,并在其中制作一些技巧,例如@ 987654324@ 或类似的东西。

标签: c# .net wpf


【解决方案1】:

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

而不是使用我在 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 事件,或者因为我没有使用该事件,所以它不会产生任何问题。

【讨论】:

    【解决方案2】:

    据我所知,这不可能立即发生。我可以用一种“模拟选择”的方式来实现它。

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

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

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

    但这只是我的做法。

    【讨论】:

      【解决方案3】:

      您可以使用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 事件。
      这是我尝试过的,可能不是处理此类情况的正确方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-14
        • 2011-05-11
        • 2012-07-09
        • 1970-01-01
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多