2012-04-02 13 views
2

Wenige Benutzer meiner Flex 4.6 Webanwendung beschweren sich, dass der mx.controls.PopUpButton in der rechten unteren Ecke manchmal eine Liste unter öffnet und somit unbrauchbar ist (ich kann nicht reproduzieren dass ich - wahrscheinlich eine unglückliche Kombination ihres Flash-Player und/oder Schriftgrößeneinstellung)Wie kann sichergestellt werden, dass das Popup immer über dem PopUpButton angezeigt wird? Mit Testfall und Screenshot

Wie konnte ich sicherstellen, dass die popUp Komponente (in meinem Fall ist es ein spark.components.List) immer oben eröffnet der PopUpButton?

Ich vermute, dass ich eine Haut basierend auf mx.skins.halo.PopUpButtonSkin erstellen und es meinem PopUpButton zuweisen soll? Und sollte ich wahrscheinlich die PopUpPosition.ABOVE Konstante zusammen mit dem PopUpAnchor verwenden?

Aber ich bin nicht sicher, wie man es zusammensetzt - kann jemand bitte einige Anweisungen teilen?

ich einen Screenshot und ein einfaches Text.mxml vorbereitet haben:

enter image description here

<?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" 
    creationComplete="init()"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 
      import mx.collections.ArrayCollection; 
      import spark.components.List; 

      [Bindable] 
      private var _data:ArrayCollection = new ArrayCollection(); 

      [Bindable] 
      private var _list:List = new List(); 

      public function init():void { 
       _data.addItem({label: "One"}); 
       _data.addItem({label: "Tow"}); 
       _data.addItem({label: "Three"}); 
       _data.addItem({label: "Four"}); 
       _data.addItem({label: "Five"}); 

       _list.dataProvider = _data; 
       _list.setStyle('fontSize', 36); 
      } 
     ]]> 
    </fx:Script> 

    <mx:PopUpButton right="10" bottom="10" fontSize="24" popUp="{_list}"/> 
</s:Application> 

UPDATE:

ich eine Lösung von Simon Bailey MX ComboBox Open Direction Bug - Alternative Solution und es ist eine Art gefunden haben funktioniert, verhindert aber leider, dass ich mein benutzerdefiniertes Ereignis nach dem Klicken auf die Schaltfläche "Haupt" (nicht "Pfeil") senden kann.

Auch habe ich bei the PopUpButton.as source code sah und sich fragen, ob vielleicht die Höhe der Liste 0 ist, während es dort geprüft wird:

private function displayPopUp(show:Boolean):void 
{ 
    ...... 
    // XXX I suspect the _popUp.height below is 0 
    // XXX for the users having the trouble 

    if (show) 
    {   
     if (point.y + _popUp.height > screen.bottom && 
      point.y > (screen.top + height + _popUp.height)) 
     { 
      // PopUp will go below the bottom of the stage 
      // and be clipped. Instead, have it grow up. 
      point.y -= (unscaledHeight + _popUp.height + 2*popUpGap); 
      initY = -_popUp.height; 
     } 

Ich kann immer noch nicht den Fehler reproduzieren mich, meine Benutzer aren‘ t sehr hilfreich (meist ältere Leute, spielen my card game). Ich habe in Adobe JIRA gesucht, konnte aber einen solchen Fehler nicht finden.

Ich frage mich, ob es eine Möglichkeit gibt, diese Methode kurzzuschließen, um das Öffnen des popUp über dem PopUpButton zu erzwingen.

Oder wenn ich die _list in einen Container setzen sollte ...

Antwort

1

PopUpButton keine PopUpAnchor verwenden. Er legt die Position des Popups intern in der privaten Funktion displayPopUp() fest.

Warum nicht den Spark DropDownList stattdessen verwenden? Ist das nicht das, was du hier effektiv erschaffen hast?

+0

Ich kann nicht auf die DropDownList klicken ("drücken Sie es wie eine Taste - um ein Ereignis zu senden), nachdem ich einen Wert ausgewählt habe - oder kann ich? –

+0

Nein, das glaube ich nicht. Wählen Sie "Auswählen", indem Sie auf die rechte Seite klicken und dann "drücken", indem Sie auf die linke Seite klicken? Das scheint mir verwirrend. Vielleicht macht es Ihr tatsächlicher Text in der Liste deutlicher, wie es funktioniert. – joshtynjala

+0

Ja, genau so benutze ich es. Kann ich etwas erreichen, indem ich "mx_internal function displayPopUp()" überschreibe? –