Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 防止子组件在其父组件获取焦点时接收焦点_Apache Flex_Flex4_Focus - Fatal编程技术网

Apache flex 防止子组件在其父组件获取焦点时接收焦点

Apache flex 防止子组件在其父组件获取焦点时接收焦点,apache-flex,flex4,focus,Apache Flex,Flex4,Focus,我有一个包含多个子组件的复合组件。当用户单击父组件时,它会收到焦点,但它的一个子组件也会收到焦点,我对此不感兴趣。是否有任何方法可以防止这种情况发生,或者焦点必须始终集中在可编辑(子)组件上?谢谢。是的,您需要使用下列属性的一些组合。注意,除了flashapi中定义的属性外,Flex还添加了其他属性 这个主题对我来说总是有点困惑,我通常通过启用/禁用各种属性来进行实验。我想你需要做这样的事情: parentComponent.tabChildren = false; parentComponen

我有一个包含多个子组件的复合组件。当用户单击父组件时,它会收到焦点,但它的一个子组件也会收到焦点,我对此不感兴趣。是否有任何方法可以防止这种情况发生,或者焦点必须始终集中在可编辑(子)组件上?谢谢。

是的,您需要使用下列属性的一些组合。注意,除了flashapi中定义的属性外,Flex还添加了其他属性

这个主题对我来说总是有点困惑,我通常通过启用/禁用各种属性来进行实验。我想你需要做这样的事情:

parentComponent.tabChildren = false;
parentComponent.hasFocusableChildren = false;
// the above is probably enough, but you can also do...
childComponent.tabEnabled = false;
childComponent.focusEnabled = false;
childComponent.mouseFocusEnabled = false;
childComponent.tabFocusEnabled = false;
以下是您可能会发现有用的鼠标/键盘焦点相关属性的列表:

  • mouseChildren
    -确定对象的子对象是否已启用鼠标或用户输入设备
  • mouseEnabled
    -指定此对象是否接收鼠标消息或其他用户输入消息
  • tabChildren
    -确定对象的子对象是否启用了选项卡
  • tabEnabled
    -指定此对象是否处于选项卡顺序
以下仅适用于Flex:

  • focusEnabled
    -指示当选项卡切换到时组件是否可以接收焦点
  • hasFocusableChildren
    -指示子对象是否可以接收焦点的标志
  • mouseFocusEnabled
    -单击时是否可以接收焦点
  • tabFocusEnabled
    -指示此对象是否可以通过TAB键接收焦点的标志。这类似于Flash Player使用的tabEnabled属性。这通常适用于处理键盘输入的组件,但控制栏中的某些组件将其设置为false,因为它们不应从另一个组件(如编辑器)窃取焦点

    • 在AS3中处理此问题的正确方法是通过InteractiveObject的tabEnabled属性。忘记FLEX吧

      tabEnabled属性控制当鼠标单击InteractiveObject时是否接收焦点并生成mouseFocusChanged事件

      我已经实现了极其复杂的焦点改变机制和跟踪,根据我的经验,最好只使用tabEnabled来控制是否可以通过鼠标或tab键接收焦点

      首先,默认情况下,对于类型为input、SimpleButtons和Sprites/MovieClips且buttonMode=true的TextField,tabEnabled将为true。所以你会遇到这种默认情况。尊重它要比记住何时何地超越它容易得多

      其次,对于要在单击时接收焦点的自定义对象,tabEnabled本质上是一个内置属性,用于控制tab键和鼠标单击是否将焦点指定给对象。tabEnabled实际上是一个糟糕的名字,因为它的功能就像“canReceiveFocusViaKeyboardOrMouse”。这是因为任何InteractiveObject实例都可以分配给stage.focus。除了覆盖默认行为之外,没有任何方法可以禁用InteractiveObject被指定为焦点,因此tabEnabled是您想要使用的

      现在,说到这里,您可以通过截取按键焦点更改和鼠标焦点更改事件轻松覆盖默认行为

      鼠标焦点更改只发送到当前具有焦点的对象。从技术上讲,当没有任何东西具有焦点时,阶段具有焦点,因此如果您第一次单击某个东西,则将以阶段为目标生成事件。同样,如果单击该阶段,焦点将设置为null,但从技术上讲,该阶段正在重新获得焦点

      按键_focus _改变功能类似,只是当舞台有焦点时,按tab键不会锁定flash播放器内的对象;要么没有焦点更改,要么其他HTML控件将获得焦点。那是故意的。同时,如果播放器中的某个对象确实具有焦点,则按tab键将循环通过可用的tab键启用的对象,而不会返回舞台。这也是出于设计。因此,例如,如果舞台上只有一个启用tab的对象,并且该对象具有焦点,则按tab键不会将焦点从其上移开。它实际上会将焦点循环回自身,并激活它的focusRect(因为更改的来源是按键)。您可以在单个对象上或在舞台上全局关闭“关键点更改激活的焦点矩形”

      现在是有趣的部分。我建议您在某些情况下拦截并阻止key\u focus\u change的默认值,并为tab键实现自己的key\u down处理程序。例如,如果希望自己的控件子集接收焦点,请截取“关键点焦点更改”事件,并查看具有焦点的对象是否是预定义对象之一。如果是,则阻止默认设置,并允许tab按键处理程序将焦点移动到循环中的下一项。您还可以使用此技术沿着父链走,直到在循环中找到一个对象,假设该对象正在失去焦点,然后将焦点移动到预定义焦点循环中的下一个项目。在本质上,您可以通过截取、取消或重定向焦点更改到允许的父控件,使tab键不那么细粒度,只关注可聚焦控件的子集

      旁注 将mouseChildren设置为false只会防止子对象成为鼠标事件的目标,因此它们仍然会对父对象的命中区域做出贡献。如果父对象的mouseEnabled=false,则它将不会接收鼠标事件(尽管作为子对象本身,它仍然可以作为父对象的命中区域)。将mouseEnable=false和mouseChildren=false设置为