防止Ctrl + Tab冒泡

时间:2014-06-05 13:38:26

标签: events actionscript tabs flex3

我正在为我的Flex项目使用ToggleButtonBar控件。当用户使用键盘关注此控件时,它允许他使用箭头键,页面向上/向下或Home / end键切换选项卡。但是,我想添加 Ctrl Tab 作为切换标签的方法。 所以,我重写方法keyDownHandler来使用它。

override protected function keyDownHandler(event:KeyboardEvent):void
{
  var updateFocusIndex:Boolean = true;

  switch (event.keyCode)
  {
    case Keyboard.TAB:
    {
      if(event.ctrlKey) 
      {
        focusManager.showFocusIndicator = true;
        drawButtonFocus(focusedIndex, false);
        if (event.shiftKey)
        {
          focusedIndex = prevIndex(focusedIndex);
        } 
        else
        {
          focusedIndex = nextIndex(focusedIndex);
        }

        if (focusedIndex != -1)
        {
          drawButtonFocus(focusedIndex, true);
          selectButton(focusedIndex, updateFocusIndex, event);
        }

        event.preventDefault();
        event.stopPropagation();
        event.stopImmediatePropagation();
      }
      break;
    }
    default:
    {
      super.keyDownHandler(event);
    }
  }
}

现在当用户按 Ctrl Tab 时,我的处理程序被执行,但也会执行标准的Tab事件,这会改变焦点。而且我不希望这种情况发生。我希望 Ctrl Tab 只更改标签而不会失去焦点。

1 个答案:

答案 0 :(得分:0)

我在这里发现了一个奇怪的解决方案:http://coder.sonicpoets.com/?p=8

似乎可以从KeyDownHandler调用FocusEvent,然后在event.preventDefault的焦点事件处理程序中阻止移动到另一个组件。

所以而不是

    event.preventDefault();
    event.stopPropagation();
    event.stopImmediatePropagation();

我用过

    isCtrlTab = true;
    this.setFocus();

并添加了

    this.addEventListener(FocusEvent.​KEY_FOCUS_CHANGE, focusChange);


    protected function focusChange(event:FocusEvent):void
    {
        if (isCtrlTab)
        {
            isCtrlTab = false;
            event.preventDefault();
        }   
    }