Flex:模态弹出中的不确定ProgressBar?

时间:2023-01-04 19:41:29

Whenever I set a indeterminate progress bar in a modal pop-up via PopUpManager, there is no progress displayed. If I add the same ProgressBar to the parent regularly or make the pop-up non-modal it works. Is there a reason why it doesn't work in modal pop-ups? and a way to make it work?

每当我通过PopUpManager在模态弹出窗口中设置不确定的进度条时,都不会显示任何进度。如果我定期向父母添加相同的ProgressBar或使弹出非模态,它可以工作。有没有理由说它在模态弹出窗口中不起作用?以及使其有效的方法?

Thanks.

4 个解决方案

#1


I have had some other developers look at this, it turns out it is a bug, but there is a work around..I'll post my original code and then the altered code for the work around:

我有其他一些开发人员看这个,结果证明这是一个bug,但有一个解决方法..我会发布我原来的代码,然后改变代码来解决这个问题:

original:

private function showLoading(e:Event = null):void
            {
                if(_progBar == null)
                {
                    _progBar = new ProgressBar();
                    _progBar.width = 200;
                    _progBar.indeterminate = true;
                    _progBar.labelPlacement = 'center';
                    _progBar.setStyle("removedEffect", fade);
                    _progBar.setStyle("addedEffect", fade);
                    _progBar.setStyle("color", 0xFFFFFF);
                    _progBar.setStyle("borderColor", 0x000000);
                    _progBar.setStyle("barColor", 0xf4b60f);
                    _progBar.label = "";
                }
                PopUpManager.addPopUp(_progBar,this,true);
                PopUpManager.centerPopUp(_progBar);
            }

work around:

private function showLoading(e:Event = null):void
            {
                if(_progBar == null)
                {
                    _progBar = new ProgressBar();
                    _progBar.width = 200;
                    _progBar.indeterminate = true;
                    _progBar.labelPlacement = 'center';
                    _progBar.setStyle("removedEffect", fade);
                    _progBar.setStyle("addedEffect", fade);
                    _progBar.setStyle("color", 0xFFFFFF);
                    _progBar.setStyle("borderColor", 0x000000);
                    _progBar.setStyle("barColor", 0xf4b60f);
                    _progBar.label = "";
                    _progBar.mode = ProgressBarMode.MANUAL;
                }
                PopUpManager.addPopUp(_progBar,this,true);
                PopUpManager.centerPopUp(_progBar);
                 _progBar.setProgress(0, 0);
            }

#2


We can do this by using containter.addChild(Pg) eg.Canvas and then use PopUpManager.

我们可以通过使用containter.addChild(Pg)eg.Canvas然后使用PopUpManager来实现。

#3


I had the same problem, but neither of the other solutions helped. Below is the code that produces the problem for me:

我有同样的问题,但其他解决方案都没有帮助。以下是为我产生问题的代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="applicationComplete();">
    <mx:Script><![CDATA[
        import mx.controls.ProgressBar;
        import mx.managers.PopUpManager;
        private function applicationComplete():void
        {
            var progressBar:ProgressBar = new ProgressBar()
            progressBar.indeterminate = true;
            PopUpManager.addPopUp(progressBar, this, true);
            //this.addChild(progressBar);           including this line overrides the popup
            //progressBar.setProgress(0, 0);        including this line makes no difference
        }
    ]]></mx:Script>
    <mx:Label text="hello"/>
</mx:Application>

The two commented out lines are what I understood to be the other suggested solutions. I managed to fix this using the awkward workaround below:

两条注释掉的线条是我所理解的其他建议的解决方案。我设法使用下面的尴尬解决方法解决了这个问题:

Step 1: Create custom mxml component, saved as Progress.mxml

步骤1:创建自定义mxml组件,保存为Progress.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:ProgressBar indeterminate="true" />
</mx:TitleWindow>

Step 2: Use custom component in code

第2步:在代码中使用自定义组件

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="applicationComplete();">
    <mx:Script><![CDATA[
        import mx.controls.ProgressBar;
        import mx.managers.PopUpManager;
        import Progress;
        private function applicationComplete():void
        {
            var progress:Progress =  new Progress();
            PopUpManager.addPopUp(progress, this, true);
            PopUpManager.centerPopUp(progress);
        }
    ]]></mx:Script>
    <mx:Label text="hello"/>
</mx:Application>

It seems that putting the ProgressBar inside the TitleWindow is important.

似乎将ProgressBar放在TitleWindow中很重要。

#4


It worked for me once I put the ProgressBar inside a TitleWindow. For instance, this was not working:

一旦我将ProgressBar放在TitleWindow中,它对我有用。例如,这不起作用:

var waitingpopup:ProgressBar = new ProgressBar();
waitingpopup.indeterminate = true;
waitingpopup.label = "Please wait, loading...";    
PopUpManager.addPopUp(waitingpopup, this, true);

And this worked

这很有效

var waitingpopup:TitleWindow = new TitleWindow();
waitingpopup.title = "Please Wait";
var pb:ProgressBar = new ProgressBar();
pb.indeterminate = true;
pb.label = "Loading...";
waitingpopup.addChild(pb);    
PopUpManager.addPopUp(waitingpopup, this, true);

#1


I have had some other developers look at this, it turns out it is a bug, but there is a work around..I'll post my original code and then the altered code for the work around:

我有其他一些开发人员看这个,结果证明这是一个bug,但有一个解决方法..我会发布我原来的代码,然后改变代码来解决这个问题:

original:

private function showLoading(e:Event = null):void
            {
                if(_progBar == null)
                {
                    _progBar = new ProgressBar();
                    _progBar.width = 200;
                    _progBar.indeterminate = true;
                    _progBar.labelPlacement = 'center';
                    _progBar.setStyle("removedEffect", fade);
                    _progBar.setStyle("addedEffect", fade);
                    _progBar.setStyle("color", 0xFFFFFF);
                    _progBar.setStyle("borderColor", 0x000000);
                    _progBar.setStyle("barColor", 0xf4b60f);
                    _progBar.label = "";
                }
                PopUpManager.addPopUp(_progBar,this,true);
                PopUpManager.centerPopUp(_progBar);
            }

work around:

private function showLoading(e:Event = null):void
            {
                if(_progBar == null)
                {
                    _progBar = new ProgressBar();
                    _progBar.width = 200;
                    _progBar.indeterminate = true;
                    _progBar.labelPlacement = 'center';
                    _progBar.setStyle("removedEffect", fade);
                    _progBar.setStyle("addedEffect", fade);
                    _progBar.setStyle("color", 0xFFFFFF);
                    _progBar.setStyle("borderColor", 0x000000);
                    _progBar.setStyle("barColor", 0xf4b60f);
                    _progBar.label = "";
                    _progBar.mode = ProgressBarMode.MANUAL;
                }
                PopUpManager.addPopUp(_progBar,this,true);
                PopUpManager.centerPopUp(_progBar);
                 _progBar.setProgress(0, 0);
            }

#2


We can do this by using containter.addChild(Pg) eg.Canvas and then use PopUpManager.

我们可以通过使用containter.addChild(Pg)eg.Canvas然后使用PopUpManager来实现。

#3


I had the same problem, but neither of the other solutions helped. Below is the code that produces the problem for me:

我有同样的问题,但其他解决方案都没有帮助。以下是为我产生问题的代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="applicationComplete();">
    <mx:Script><![CDATA[
        import mx.controls.ProgressBar;
        import mx.managers.PopUpManager;
        private function applicationComplete():void
        {
            var progressBar:ProgressBar = new ProgressBar()
            progressBar.indeterminate = true;
            PopUpManager.addPopUp(progressBar, this, true);
            //this.addChild(progressBar);           including this line overrides the popup
            //progressBar.setProgress(0, 0);        including this line makes no difference
        }
    ]]></mx:Script>
    <mx:Label text="hello"/>
</mx:Application>

The two commented out lines are what I understood to be the other suggested solutions. I managed to fix this using the awkward workaround below:

两条注释掉的线条是我所理解的其他建议的解决方案。我设法使用下面的尴尬解决方法解决了这个问题:

Step 1: Create custom mxml component, saved as Progress.mxml

步骤1:创建自定义mxml组件,保存为Progress.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:ProgressBar indeterminate="true" />
</mx:TitleWindow>

Step 2: Use custom component in code

第2步:在代码中使用自定义组件

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="applicationComplete();">
    <mx:Script><![CDATA[
        import mx.controls.ProgressBar;
        import mx.managers.PopUpManager;
        import Progress;
        private function applicationComplete():void
        {
            var progress:Progress =  new Progress();
            PopUpManager.addPopUp(progress, this, true);
            PopUpManager.centerPopUp(progress);
        }
    ]]></mx:Script>
    <mx:Label text="hello"/>
</mx:Application>

It seems that putting the ProgressBar inside the TitleWindow is important.

似乎将ProgressBar放在TitleWindow中很重要。

#4


It worked for me once I put the ProgressBar inside a TitleWindow. For instance, this was not working:

一旦我将ProgressBar放在TitleWindow中,它对我有用。例如,这不起作用:

var waitingpopup:ProgressBar = new ProgressBar();
waitingpopup.indeterminate = true;
waitingpopup.label = "Please wait, loading...";    
PopUpManager.addPopUp(waitingpopup, this, true);

And this worked

这很有效

var waitingpopup:TitleWindow = new TitleWindow();
waitingpopup.title = "Please Wait";
var pb:ProgressBar = new ProgressBar();
pb.indeterminate = true;
pb.label = "Loading...";
waitingpopup.addChild(pb);    
PopUpManager.addPopUp(waitingpopup, this, true);