可以在不使用 MXML 的情况下使用 Flex 框架/组件吗?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 的示例中不起作用。

以上是关于可以在不使用 MXML 的情况下使用 Flex 框架/组件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不影响其兄弟位置的情况下将 div 绝对定位在弹性框中? [复制]

从 Flex - mxml(动作脚本)迁移到另一种技术

如何在不使用间隙的情况下使用 flex 创建间隙空间 [重复]

从Flex-mxml(动作脚本)移动到另一种技术

FLEX,VideoDisplay:如何在不自动运行的情况下自动加载

如何在 Flex 文本框中创建一个全选功能?