【问题标题】:Possible to use Flex Framework/Components without using MXML?可以在不使用 MXML 的情况下使用 Flex 框架/组件吗?
【发布时间】:2010-09-13 13:36:17
【问题描述】:

是否可以在不使用 MXML 的情况下使用 Flex 框架和组件?我非常了解 ActionScript,并且不想为了获得一些简单的 UI 而使用一些新的 XML 语言。谁能提供一个包含可以编译的 .as 文件的示例(最好是通过 FlashDevelop,虽然只是告诉如何使用 Flex SDK 也可以)并使用 Flex 框架?例如,只显示一个弹出警报的 Flex 按钮就很完美了。

如果不可能,谁能提供一个最小的 MXML 文件,该文件将引导一个自定义 AS 类,然后可以访问 Flex SDK?

【问题讨论】:

    标签: apache-flex actionscript-3 mxml flashdevelop


    【解决方案1】:

    是的,您只需要在类路径中包含 flex swc。你可以在frameoworks/lib/flex.swc的flex sdk中找到flex.swc

    编辑:还有一件事:如果您使用的是 Flex Builder,您可以简单地创建一个新的 ActionScript 项目,它的作用基本上与上述相同。

    【讨论】:

    • 这不太行。当您实际尝试使用 Button 或 DataGrid 等 Flex 组件时,您会遇到各种错误
    【解决方案2】:

    这是一个非常简单的应用程序,它只执行 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);
    }
    

    【讨论】:

    • 这很好,但不幸的是在 FlashDevelop 中没有代码完成,例如“按钮”。有什么方法可以实现吗?
    【解决方案3】:

    注意:除非您首先初始化 Flex 库,否则以下答案实际上不会起作用。有很多代码可以做到这一点。有关详细信息,请参阅下面的 cmets 或其他答案。


    主类甚至不必在 MXML 中,只需创建一个继承自 mx.core.Application 的类(无论如何编译带有 &lt;mx:Application&gt; 根节点的 MXML 类):

    package {
    
      import mx.core.Application;
    
    
      public class MyFancyApplication extends Application {
    
        // do whatever you want here
    
      }
    
    }
    

    此外,任何使用mxmlc 编译器(甚至是 Flash CS3 创作工具)编译的 ActionScript 代码都可以使用 Flex 类,只需使它们在类路径中可用(参考框架 SWC,当使用mxmlc 或在使用任一时指向包含源的文件夹)。但是,除非文档类继承自 mx.core.Application,否则您可能会遇到一些麻烦,因为框架中的某些东西假设是这种情况。

    【讨论】:

    • 嗯...我去实际尝试一下,一个简单的“Hello World”会产生大量运行时错误。是否需要进行某种初始化,或者需要包含其他特定类?
    • 很容易找到,只需在编译器标志中添加-keep-generated-actionscript,并编译一个继承自Application的MXML类。编译器会创建一个名为“generated”的目录,您可以在其中找到生成的 ActionScript 代码。确实比上面的要复杂一点。
    【解决方案4】:

    我做了一个类似于 Borek 的简单引导程序(见下文)。我很想摆脱 mxml 文件,但如果我没有它,我就不会得到 Flex 附带的任何标准主题(haloclassic.swc 等)。有人知道如何按照 Theo 的建议去做并且仍然应用标准主题吗?

    这是我的简化引导方法:

    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!");
            }
        }
    }
    

    【讨论】:

    • 酷,这看起来就像你能得到的一样最小,mxml-wise。接受您的回答,因为它几乎是纯 AS 代码。
    • 漂亮,谢谢。使用 FlashDevelop,您甚至可以对“按钮”等对象进行丰富的代码完成。好的。这在 Borek 的示例中不起作用。
    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2023-03-14
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多