2013-06-03 2 views
0

Как отключить или скрыть пользовательские объекты ContextMenu, когда пользователь щелкнет правой кнопкой мыши по заголовку? Я попытался установить customItems пустой массив:Flex: отключить пользовательские элементы ContextMenu в заголовках AdvancedDataGrid

class MyAdvancedDataGridHeaderRenderer 
    extends AdvancedDataGridHeaderRenderer { 
    protected function onComplete(event:FlexEvent) { 
    contextMenu.customItems = []; 
    } 
} 

... но Контекстное для заголовка равна нулю.

ответ

0

Выяснил это. Я просто отключил заданные пункты меню, когда заголовок перепутан. ContextMenuItem s отключены, если они находятся в массиве hiddenContextItems.

Я привел пример, который использует мой объект ExtendedAdvancedDataGridHeaderRenderer, который я создал в случае, если кто-либо заинтересован.

В приведенном ниже примере представлена ​​диаграмма с тремя столбцами: красный, зеленый и синий. Первая строка является наивысшим контрастом для этого цвета и каждой строки после уменьшения уровня контрастности. Это создает эффект градиента на сетке. Вы можете скопировать шестнадцатеричное значение цвета в буфер обмена, щелкнув правой кнопкой мыши на ячейке.

ExtendedAdvancedDataGridHeaderRenderer.as

package components { 
    import flash.events.MouseEvent; 
    import flash.ui.ContextMenuItem; 

    import mx.controls.AdvancedDataGrid; 
    import mx.controls.advancedDataGridClasses.AdvancedDataGridHeaderRenderer; 

    public class ExtendedAdvancedDataGridHeaderRenderer extends AdvancedDataGridHeaderRenderer { 

    private var _hiddenContextMenuItems:Array; // of String 

    public function get hiddenContextMenuItems():Array { 
     return _hiddenContextMenuItems; 
    } 

    public function set hiddenContextMenuItems(value:Array):void { 
     _hiddenContextMenuItems = value; 
    } 

    public function ExtendedAdvancedDataGridHeaderRenderer() { 
     super(); 
     hiddenContextMenuItems = [ExtendedAdvancedDataGrid.MENU_COPY]; 
     this.addEventListener(MouseEvent.MOUSE_OVER, onRollOver); 
     this.addEventListener(MouseEvent.MOUSE_OUT, onRollOut); 
    } 

    protected function onRollOver(event:MouseEvent):void { 
     disableMenuItems(hiddenContextMenuItems); 
    } 

    protected function onRollOut(event:MouseEvent):void { 
     disableMenuItems([]); 
    } 

    private function disableMenuItems(arr:Array):void { 
     if (arr != null && this.owner is AdvancedDataGrid) { 
     var adg:AdvancedDataGrid = this.owner as AdvancedDataGrid; 
     if (adg.contextMenu != null && adg.contextMenu.customItems != null) { 
      for each (var item:ContextMenuItem in adg.contextMenu.customItems) { 
      item.enabled = !arrContainsStr(arr, item.caption); 
      } 
     } 
     } 
    } 

    private function arrContainsStr(arr:Array, str:String):Boolean { 
     for each (var arrStr:String in arr) 
     if (arrStr == str) 
      return true; 
     return false; 
    } 
    } 
} 

ExtendedAdvancedDataGridItemRenderer.as

package components { 
    import mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer; 

    public class ExtendedAdvancedDataGridItemRenderer 
     extends AdvancedDataGridItemRenderer { 
    public function ExtendedAdvancedDataGridItemRenderer() { 
     super(); 
    } 

    override public function set data(value:Object):void { 
     super.data = value; 
     this.background = true; 
     var bgColor:uint = parseInt(listData.label, 16); 
     var fgColor:uint = bgColor^0xFFFFFF; 
     this.backgroundColor = bgColor; 
     this.setStyle('color', fgColor); 
     this.setStyle('textRollOverColor', 0xFFFFFF); 
    } 
    } 
} 

ExtendedAdvancedDataGridColumn.as

package components { 
    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; 
    import mx.core.ClassFactory; 

    public class ExtendedAdvancedDataGridColumn extends AdvancedDataGridColumn { 
    public function ExtendedAdvancedDataGridColumn(columnName:String=null) { 
     super(columnName); 
     headerRenderer = new ClassFactory(ExtendedAdvancedDataGridHeaderRenderer); 
     itemRenderer = new ClassFactory(ExtendedAdvancedDataGridItemRenderer); 
    } 
    } 
} 

ExtendedAdvancedDataGrid.as

package components { 
    import flash.display.Sprite; 
    import flash.events.ContextMenuEvent; 
    import flash.system.System; 
    import flash.ui.ContextMenu; 
    import flash.ui.ContextMenuItem; 

    import mx.controls.AdvancedDataGrid; 
    import mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer; 
    import mx.events.FlexEvent; 
    import mx.utils.StringUtil; 

    public class ExtendedAdvancedDataGrid extends AdvancedDataGrid { 

    public static const MENU_COPY:String = 'Copy Hex Value'; 

    public function ExtendedAdvancedDataGrid() { 
     super(); 
     this.addEventListener(FlexEvent.INITIALIZE, onInitialize); 
    } 

    protected function onInitialize(event:FlexEvent):void { 
     contextMenu = new ContextMenu(); 
     contextMenu.hideBuiltInItems(); 
     var item:ContextMenuItem = new ContextMenuItem(MENU_COPY); 
     item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, copyCellContents); 
     contextMenu.customItems.push(item); 
    } 

    protected function copyCellContents(event:ContextMenuEvent):void { 
     if (event.mouseTarget is AdvancedDataGridItemRenderer) { 
     var text:String = (event.mouseTarget as AdvancedDataGridItemRenderer).text; 
     System.setClipboard(StringUtil.substitute('#{0}', text)); 
     } 
    } 
    } 
} 

App.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       minWidth="955" minHeight="600" 
       xmlns:components="components.*" 
       initialize="onInitialize(event)"> 
    <fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 
     import mx.utils.StringUtil; 

     [Bindable] protected var gridData:ArrayCollection; 

     protected function onInitialize(event:FlexEvent):void { 
     gridData = new ArrayCollection(); 
     for (var i:uint = 15; i >= 0; i--) { 
      var hexVal:String = intVal.toString(i) 
      var red:String = StringUtil.substitute('{0}{0}0000', hexVal); 
      var green:String = StringUtil.substitute('00{0}{0}00', hexVal); 
      var blue:String = StringUtil.substitute('0000{0}{0}', hexVal); 
      gridData.addItem({'red': red, 'green': green, 'blue': blue}); 
     } 
     grid.invalidateDisplayList(); 
     } 
    ]]> 
    </fx:Script> 
    <s:BorderContainer horizontalCenter="0"> 
    <components:ExtendedAdvancedDataGrid id="grid" dataProvider="{gridData}" 
     rowCount="{gridData.length + 1}"> 
    <components:columns> 
     <components:ExtendedAdvancedDataGridColumn dataField="red" headerText="Red"/> 
     <components:ExtendedAdvancedDataGridColumn dataField="green" headerText="Green"/> 
     <components:ExtendedAdvancedDataGridColumn dataField="blue" headerText="Blue"/> 
    </components:columns> 
    </components:ExtendedAdvancedDataGrid> 
    </s:BorderContainer> 
</s:Application> 

 Смежные вопросы

  • Нет связанных вопросов^_^