我正在使用新的Flex4 Spark的東西,但我陷入了一個可怕的問題。首先讓我解釋一下情況。我有一個容器mx:Canvas
其中我做addElement()
一個類型實例DocumentWindow
。根據文檔的類型,文檔窗口類應該是視圖的持有者。 DocumentWindow
類延伸TitleWindow
。我還有一個任務欄,裏面有mx:Canvas
和buttonBar
,所以窗戶應該是可切換的。所以用兩個字我有窗口持有人和一個任務欄。使用addElement的Flex4不能正確顯示元素
現在出現了一個奇怪的現象:當我把DocumentWindow
的類型爲「doc」(它載入由swftools創建的swf)時,該窗口出現在窗口保持器中並作爲任務欄上的任務。但是,如果首先打開其他內容 - DocumentWindow
,其類型爲音頻或視頻,導致DocumentWindow
在內部實例化不同的視圖,則該窗口不會出現在屏幕上,taskBar
中也沒有顯示任務按鈕。我在上面放了一個trace()
,它表明numElements
正在增加,taskBar ButtonBar.dataProvider.length
增加了,所以事情就在那裏 - 只是他們保持隱形,直到我打開DocumentWindow
類型'doc'?!我甚至試圖讓DocumentWindow
不加載視圖裏面,因爲我認爲唯一的區別是視圖...但是,即使是'文檔'鍵入DocumentWindow
沒有顯示。一條線索可能是creationComplete
在添加'doc'視圖之前永遠不會被調用。任何想法可能是錯誤的?
這裏是一個跟蹤我從窗戶持有人得到(有從窗戶架Canvas
和ButtonBar.dataProvider.length
從taskBar
numElements
):
1 windows, 1 tasks win[0] = (0, 0) - [550, 400], visible=true, alpha=1 1 windows, 1 tasks win[0] = (0, 0) - [550, 400], visible=true, alpha=1 1 windows, 1 tasks win[0] = (0, 0) - [550, 400], visible=true, alpha=1 1 windows, 1 tasks win[0] = (0, 0) - [550, 400], visible=true, alpha=1 1 windows, 1 tasks win[0] = (0, 0) - [550, 400], visible=true, alpha=1
PS:我trace()
D還窗戶架大小 - 這是確定,它是足夠大的:))
這裏是主容器代碼:
<s:Group
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:components="some.package.components.*"
initialize="init()"
creationComplete="main()">
<fx:Script>
<![CDATA[
public function openDocument(di:DocumentInfo, id:String = null):TaskInfo {
var w:DocumentWindow = new DocumentWindow();
var t:TaskInfo = new TaskInfo(di, w, id);
w.title = di.label;
var docInfo:DocumentInfo = mServer.getDocumentInfo(di.type, di.label);
w.init(docInfo, t);
windows.addWindow(w);
taskBar.addTask(t);
return t;
}
]]>
</fx:Script>
<mx:HBox id="bottomButtons" horizontalGap="0"
left="0" bottom="0">
<mx:Button id="userListButton" click="toggleUserList()"
width="40" height="40"/>
<mx:Canvas id="handButtons"
horizontalScrollPolicy="off" verticalScrollPolicy="off"
width="40" height="40">
<mx:Button id="raiseHandButton" click="toggleRaiseHand()"
visible="false" width="40" height="40"/>
<mx:Button id="sitDownButton" click="doSitDown()"
visible="false" width="40" height="40"/>
</mx:Canvas>
</mx:HBox>
<mx:HDividedBox id="vdivider" left="0" top="0" right="0" bottom="40">
<components:WindowsView id="windows"/>
<components:RightPanel id="rightPanel"/>
</mx:HDividedBox>
<components:TaskBar id="taskBar"
left="{bottomButtons.width}" bottom="0" right="0" height="40"/>
</s:Group>
這裏是WindowsView
類代碼:
<?xml version="1.0" encoding="utf-8"?>
<s:Group
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
click="showStuff()"
width="100%" height="100%">
<fx:Script>
<![CDATA[
import some.package.EClassView;
import mx.events.FlexEvent;
private function showStuff():void {
trace(numChildren + ' windows, ' + EClassView.instance.taskBar.taskButtons.dataProvider.length + ' tasks');
var w:DocumentWindow;
for(var i:int = 0; i < numElements; ++i) {
w = getElementAt(i) as DocumentWindow;
if(w == null) continue;
trace("\twin[" + i + "] = (" + w.x + ", " + w.y + ") - [" + w.width + ", " + w.height + "], visible=" + w.visible + ", alpha=" + w.alpha);
}
}
public function addWindow(w:DocumentWindow):void {
w.addEventListener(FlexEvent.CREATION_COMPLETE, onWindowCreation);
addElement(w);
}
private function onWindowCreation(e:FlexEvent):void {
var w:DocumentWindow = e.currentTarget as DocumentWindow;
w.removeEventListener(FlexEvent.CREATION_COMPLETE, onWindowCreation);
w.center();
}
]]>
</fx:Script>
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="0xeeeeee" alpha="1"/>
</s:fill>
</s:Rect>
</s:Group>
的TaskBar
代碼:
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
initialize="init()"
creationComplete="main()">
<fx:Script>
<![CDATA[
import some.package.EClassView;
import some.package.data.TaskInfo;
import some.package.events.TaskEvent;
import some.package.skins.GradientButtonSkin;
import mx.collections.ArrayCollection;
import mx.core.IVisualElement;
import mx.core.IVisualElementContainer;
import mx.events.ItemClickEvent;
import spark.components.Button;
import spark.components.DataGroup;
import spark.components.Group;
import spark.events.IndexChangeEvent;
import spark.skins.spark.ButtonBarSkin;
private var mTasks:ArrayCollection;
public function get tasks():ArrayCollection {
return mTasks;
}
private function init():void {
mTasks = new ArrayCollection([]);
}
private function main():void {
taskButtons.dataProvider = mTasks;
}
public function addTask(task:TaskInfo):void {
task.index = mTasks.length;
mTasks.addItem(task);
task.win.addEventListener("minimize", onWinMinimize);
task.win.addEventListener("maximize", onWinMaximize);
task.win.addEventListener("restore", onWinRestore);
taskButtons.selectedIndex = task.index;
}
public function removeTaskAt(i:int):void {
var task:TaskInfo = mTasks[i] as TaskInfo;
var evt:TaskEvent = new TaskEvent(TaskEvent.CLOSING);
task.dispatchEvent(evt);
if(evt.stopped) return;
mTasks.removeItemAt(i) as TaskInfo;
EClassView.instance.windows.removeElement(task.win);
task.win.removeEventListener("minimize", onWinMinimize);
task.win.removeEventListener("maximize", onWinMaximize);
task.win.removeEventListener("restore", onWinRestore);
rebuildTaskIndexes();
}
public function getTaskById(tid:String):TaskInfo {
for each(var t:TaskInfo in mTasks) {
if(t.id == tid) return t;
}
return null;
}
public function set volume(v:Number):void {
for each(var t:TaskInfo in mTasks) {
t.win.view.setVolume(v);
}
}
private function rebuildTaskIndexes():void {
for(var n:int = 0; n < mTasks.length; ++n)
(mTasks[n] as TaskInfo).index = n;
}
private function onWinMinimize(e:Event):void {
var win:DocumentWindow = e.currentTarget as DocumentWindow;
win.visible = false;
var desktop:IVisualElementContainer = win.parent as IVisualElementContainer;
var nw:DocumentWindow;
taskButtons.selectedIndex = mTasks.length - 1;
}
private function onWinMaximize(e:Event):void {
var win:DocumentWindow = e.currentTarget as DocumentWindow;
win.bring2front();
win.resizable = win.movable = false;
win.maximized = true;
var ws:WindowsView = EClassView.instance.windows;
win.width = ws.width;
win.height = ws.height;
}
private function onWinRestore(e:Event):void {
var win:DocumentWindow = e.currentTarget as DocumentWindow;
win.doRestore();
}
private function onTaskChanged(e:MouseEvent):void {
var newt:TaskInfo = mTasks[taskButtons.selectedIndex] as TaskInfo;
newt.win.doRestore();
}
]]>
</fx:Script>
<s:ButtonBar id="taskButtons" requireSelection="true" styleName="taskbar"
labelField="title" click="onTaskChanged(event)"
x="0" width="{width - taskButtons.x}" height="100%"/>
</s:Group>
並實際DocumentWindow
的creationComplete
從不分派!我認爲DocumentView
類型的'doc'會創建一些其他視圖中缺少的事件...但是這些視圖太複雜了,無法在此處發佈..這將是一個巨大的帖子:)
不幸的是,我不能顯示代碼,因爲它太龐大且充滿了網絡邏輯。無論如何,我可以告訴我,我已經嘗試了addChild()和addElement - 沒有任何區別。我提醒你,不僅窗戶不可見,而且任務欄的按鈕!這意味着問題似乎正在重新繪製事物的方式,或類似的東西。我會嘗試儘快粘貼一些簡化的代碼。 – itnix 2010-08-20 06:55:33
如果您確實需要幫助,我強烈建議您將代碼轉換爲儘可能最小的可運行示例以演示此問題。 – JeffryHouser 2010-08-20 11:52:12