Im zweiten Teil der „Gumbo-Wochen” zum Flex 4 SDK geht es um das Thema CSS.

Da in Flex 4 sowohl Halo- als auch Spark-Komponenten zusammen verwendet werden können, kann es passieren, dass eine Komponenten mit dem gleichen Namen in beiden Sets vorkommt (z.B. Button). Um in einem solchen Fall die Komponenten trotzdem grafisch unterschiedlich gestalten zu können, muss das Konzept der Namespaces (siehe Neuer Namespace und Spark-Komponenten) konsequenterweise auch im CSS angewendet werden.

@namespace

Adobe hat sich entschieden, die Syntax in Flex den Empfehlungen des CSS3-Standards zu entnehmen. Zu Beginn des Stylesheets werden mit @namespace die Namespaces festgelegt. Dies muss vor allem anderen geschehen (d.h. vor @font-face oder Stildefinitionen). Im Beispiel ist "s" ist die Abkürzungen für Spark und "mx" für Halo.

XML:
  1. @namespace s "library://ns.adobe.com/flex/spark";
  2. @namespace mx "library://ns.adobe.com/flex/halo";

Jetzt kann man mithilfe der Syntax Präfix|Komponente {...} gezielt auf eine Komponente zugreifen, z.B. mx|Button { color:#00FF00; }. Im Gesamten sieht dies nun so aus:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. :Application name="MyDemoApp"
  3.         xmlns:fx="http://ns.adobe.com/mxml/2009"
  4.         xmlns:s="library://ns.adobe.com/flex/spark"
  5.         xmlns:mx="library://ns.adobe.com/flex/halo">
  6.    
  7.     :Style>
  8.         @namespace s "library://ns.adobe.com/flex/spark";
  9.         @namespace mx "library://ns.adobe.com/flex/halo";
  10.  
  11.         s|Button {
  12.             baseColor: #00A0E3;
  13.         }
  14.  
  15.         mx|Button {
  16.             baseColor: #C9D187;
  17.         }
  18.     :Style> 
  19.      
  20.     :Button label="Button #1 (Spark)" x="0"/>
  21.     :Button label="Button #2 (Halo)" x="150" />
  22.  
  23. :Application>

Namespace für meistgenutze Komponenten weglassen

Wenn man beispielsweise zum größten Teil nur eine Art von Komponenten verwendet, kann man bei diesem Namespace das Präfix auch weglassen. Dieser Namespace wird dann zum Standard/Default, wenn nichts weiter dabeisteht. Man benötigt das Präfix dann nur für andere Namespaces, wodurch man Schreibarbeit spart.

XML:
  1. :Style>
  2.         @namespace "library://ns.adobe.com/flex/spark";
  3.         @namespace mx "library://ns.adobe.com/flex/halo";
  4.  
  5.         Button {
  6.             baseColor: #00A0E3;
  7.         }
  8.  
  9.         mx|Button {
  10.             baseColor: #C9D187;
  11.         }
  12.     :Style>

Das Beispiel liefert das gleiche Ergebnis wie oben zusehen ist.

Verwendet man z.B. nur die aktuellen Spark-Komponenten und möchte diese per Style-Sheet gestalten, geht dies deshalb so:

XML:
  1. :Style>
  2.         @namespace "library://ns.adobe.com/flex/spark";
  3.  
  4.         Button {
  5.             baseColor: #00A0E3;
  6.         }
  7.  
  8.     :Style>

Link: CSS Namespaces Support