Можно ли использовать Flex Framework / компоненты без использования MXML?

Можно ли использовать Flex Framework и компоненты без MXML? Я довольно неплохо знаю ActionScript и не хочу возиться с каким-то новым языком XML только для того, чтобы получить там какой-нибудь простой пользовательский интерфейс. Может ли кто-нибудь предоставить пример, состоящий из файла .as, который может быть скомпилирован (в идеале с помощью FlashDevelop, хотя можно просто указать, как это сделать с помощью Flex SDK) и использует Flex Framework? Например, было бы идеально просто показать гибкую кнопку, которая открывает всплывающее уведомление.

Если это невозможно, может ли кто-нибудь предоставить минимальный файл MXML, который будет загружать пользовательский класс AS, который затем имеет доступ к Flex SDK?


person davr    schedule 26.09.2008    source источник


Ответы (4)


Я сделал простой бутстрап, похожий на Borek (см. Ниже). Я бы с удовольствием избавился от файла mxml, но если у меня его нет, я не получу ни одной из стандартных тем, которые поставляются с Flex (haloclassic.swc и т. Д.). Кто-нибудь знает, как делать то, что предлагает Тео, и при этом применять стандартные темы?

Вот мой упрощенный метод начальной загрузки:

main.mxml

<?xml version="1.0" encoding="utf-8"?>
<custom:ApplicationClass xmlns:custom="components.*"/>

ApplicationClass.as

package components {
    import mx.core.Application;
    import mx.events.FlexEvent;
    import flash.events.MouseEvent;
    import mx.controls.Alert;
    import mx.controls.Button;

    public class ApplicationClass extends Application {
        public function ApplicationClass () {
            addEventListener (FlexEvent.CREATION_COMPLETE, handleComplete);
        }
        private function handleComplete( event : FlexEvent ) : void {
            var button : Button = new Button();
            button.label = "My favorite button";
            button.styleName="halo"
            button.addEventListener(MouseEvent.CLICK, handleClick);
            addChild( button );
        }
        private function handleClick(e:MouseEvent):void {
            Alert.show("You clicked on the button!", "Clickity");
        }
    }
}

Вот необходимые обновления для использования с Flex 4:

main.mxml

<?xml version="1.0" encoding="utf-8"?>
<local:MyApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="components.*" />

MyApplication.as

package components {
    import flash.events.MouseEvent;
    import mx.controls.Alert;
    import mx.events.FlexEvent;
    import spark.components.Application;
    import spark.components.Button;

    public class MyApplication extends Application {
        public function MyApplication() {
              addEventListener(FlexEvent.CREATION_COMPLETE, creationHandler);
        }
        private function creationHandler(e:FlexEvent):void {
            var button : Button = new Button();
            button.label = "My favorite button";
            button.styleName="halo"
            button.addEventListener(MouseEvent.CLICK, handleClick);
            addElement( button );
        }
        private function handleClick(e:MouseEvent):void {
            Alert.show("You clicked it!", "Clickity!");
        }
    }
}
person jgormley    schedule 20.10.2008
comment
Круто, это выглядит настолько минимально, насколько это возможно, с точки зрения mxml. Принимаю ваш ответ, так как это почти чистый код AS. - person davr; 21.10.2008
comment
Большое спасибо. Используя FlashDevelop, у вас даже есть обширная функция автозавершения кода для таких объектов, как кнопка. Хороший. В примере с Бореком это не сработало. - person Edward Tanguay; 23.10.2008

Это очень простое приложение, которое выполняет только базовую загрузку в MXML. Это MXML:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">
  <mx:Script source="Script.as" />
</mx:Application>

Это Script.as:

import mx.controls.Button;
import flash.events.MouseEvent;
import mx.controls.Alert;
import mx.core.Application;

private function onCreationComplete() : void {
  var button : Button = new Button();
  button.label = "Click me";
  button.addEventListener(MouseEvent.CLICK, function(e : MouseEvent) : void {
    Alert.show("Clicked");
  });

  Application.application.addChild(button);
}
person Borek Bernard    schedule 26.09.2008
comment
Это хорошо, но, к сожалению, в FlashDevelop нет автозавершения кода, например. кнопка. Любой способ включить это? - person Edward Tanguay; 23.10.2008

ПРИМЕЧАНИЕ. Приведенный ниже ответ на самом деле не будет работать, если вы сначала не инициализируете библиотеку Flex. Для этого требуется много кода. См. Комментарии ниже или другие ответы для получения более подробной информации.


Основной класс даже не обязательно должен быть в MXML, просто создайте класс, который наследуется от mx.core.Application (как в любом случае компилируется класс MXML с корневым узлом <mx:Application>):

package {

  import mx.core.Application;


  public class MyFancyApplication extends Application {

    // do whatever you want here

  }

}

Кроме того, любой код ActionScript, скомпилированный с помощью mxmlc компилятора - или даже инструмента разработки Flash CS3 - может использовать классы Flex, это просто вопрос их доступности в пути к классам (ссылаясь на SWC фреймворка при использовании mxmlc или указывая на папка, содержащая исходный код при использовании любого из них). Если класс документа не наследуется от mx.core.Application, вы можете столкнуться с некоторыми проблемами, поскольку некоторые вещи в структуре предполагают, что это так.

person Theo    schedule 26.09.2008
comment
Хм ... Я действительно пошел попробовать это, и простой Hello World получает массу ошибок времени выполнения. Есть ли какая-то инициализация, которую мне нужно сделать, или другие конкретные классы, которые мне нужно включить? - person davr; 29.09.2008
comment
Это очень легко узнать, просто добавьте -keep-generated-actionscript к флагам компилятора и скомпилируйте класс MXML, наследуемый от Application. Компилятор создает каталог с именем created, в котором можно найти сгенерированный код ActionScript. Это, правда, немного сложнее, чем указано выше. - person Theo; 29.09.2008

Да, вам просто нужно включить flex swc в свой путь к классам. Вы можете найти flex.swc в гибком sdk в frameoworks / lib / flex.swc

edit: Еще одна вещь: если вы используете Flex Builder, вы можете просто создать новый проект ActionScript, который по сути будет делать то же, что и выше.

person Antti    schedule 26.09.2008
comment
Это не совсем работает. При попытке использовать компоненты Flex, такие как Button, DataGrid и т. Д., Возникают различные ошибки. - person davr; 26.07.2010