可以在不使用 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
的类(无论如何编译带有 <mx:Application>
根节点的 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 创建间隙空间 [重复]