对话框面板在开关上无法正确隐藏-是否有解决方法?

问题描述

我有一个对话框,其中包含两个面板,如下所示,它们是使用给定的代码创建的。如右图所示,第二个面板仍包含第一个面板中的内容。

Dialog panels

是否有解决方法?

我觉得应该在Stackoverflow上提及此类错误。

class TestDialog : UIFrame{
    TagGroup panel_list;
    
    /**
     * Switch to the `index`-th panel.
     */
    void switchToPanel(object self,number index){
        panel_list.DLGValue(index);
    }
    
    void switchToPanel0(object self){self.switchToPanel(0);}
    void switchToPanel1(object self){self.switchToPanel(1);}
    
    /**
     * Create the dialog content
     */
    TagGroup createContent(object self){
        panel_list = DLGCreatePanelList(0);
        
        TagGroup box,switch_button,input,panel;

        // panel 1
        box = DLGCreateBox("Panel 1");
        
        // switch panel button
        switch_button = DLGCreatePushButton("Switch to panel 2","switchToPanel1");
        box.DLGAddElement(switch_button);
        
        // input field
        input = DLGCreateStringField("ABC");
        box.DLGAddElement(input);
        
        panel = DLGCreatePanel();
        panel.DLGAddElement(box);
        panel_list.DLGAddElement(panel);

        // panel 2
        box = DLGCreateBox("Panel 2");
        
        // switch panel button
        switch_button = DLGCreatePushButton("Switch to panel 1","switchToPanel0");
        box.DLGAddElement(switch_button);
        
        // add a label so both boxes have different heights
        box.DLGAddElement(DLGCreateLabel(""));
        
        // input field
        input = DLGCreateStringField("DEF");
        box.DLGAddElement(input);
        
        panel = DLGCreatePanel();
        panel.DLGAddElement(box);
        panel_list.DLGAddElement(panel);
        
        TagGroup wrapper = DLGCreateGroup();
        wrapper.DLGAddElement(panel_list);

        return wrapper;
    }

    object init(object self){
        return self.super.init(self.createContent())
    }
}

alloc(TestDialog).init().pose()

解决方法

修复:手动隐藏

经过大量尝试,我认为手动触发UIFrame::SetElementIsShown()可以解决此问题。在给定的示例中,可以将标识符input0添加到第一个输入,将input1添加到第二个输入,然后将TestDialog::switchToPanel()函数更改为以下内容:

/**
* Switch to the `index`-th panel.
*/
void switchToPanel(object self,number index){
    panel_list.DLGValue(index);
    
    if(index == 0){
        self.setElementIsShown("input0",1);
        self.setElementIsShown("input1",0);
    }
    else{
        self.setElementIsShown("input0",0);
        self.setElementIsShown("input1",1);
    }
}

完整的代码如下:

class TestDialog : UIFrame{
    TagGroup panel_list;
    
    /**
    * Switch to the `index`-th panel.
    */
    void switchToPanel(object self,number index){
        panel_list.DLGValue(index);
        
        if(index == 0){
            self.setElementIsShown("input0",1);
            self.setElementIsShown("input1",0);
        }
        else{
            self.setElementIsShown("input0",0);
            self.setElementIsShown("input1",1);
        }
    }
    
    void switchToPanel0(object self){self.switchToPanel(0);}
    void switchToPanel1(object self){self.switchToPanel(1);}
    
    /**
     * Create the dialog content
     */
    TagGroup createContent(object self){
        panel_list = DLGCreatePanelList(0);
        
        TagGroup box,switch_button,input,panel;

        // panel 1
        box = DLGCreateBox("Panel 1");
        
        // switch panel button
        switch_button = DLGCreatePushButton("Switch to panel 2","switchToPanel1");
        box.DLGAddElement(switch_button);
        
        // input field
        input = DLGCreateStringField("ABC");
        input.DLGIdentifier("input0");
        box.DLGAddElement(input);
        
        panel = DLGCreatePanel();
        panel.DLGAddElement(box);
        panel_list.DLGAddElement(panel);

        // panel 2
        box = DLGCreateBox("Panel 2");
        
        // switch panel button
        switch_button = DLGCreatePushButton("Switch to panel 1","switchToPanel0");
        box.DLGAddElement(switch_button);
        
        // add a label so both boxes have different heights
        box.DLGAddElement(DLGCreateLabel(""));
        
        // input field
        input = DLGCreateStringField("DEF");
        input.DLGIdentifier("input1");
        box.DLGAddElement(input);
        
        panel = DLGCreatePanel();
        panel.DLGAddElement(box);
        panel_list.DLGAddElement(panel);
        
        TagGroup wrapper = DLGCreateGroup();
        wrapper.DLGAddElement(panel_list);

        return wrapper;
    }

    object init(object self){
        return self.super.init(self.createContent())
    }
}

alloc(TestDialog).init().pose()

解决方法:使用标签页

我还发现选项卡使用完全相同的代码。因此,如果可能的话,只需将面板替换为标签即可。

class TestDialog : UIFrame{
    TagGroup tab_list;
    TagGroup inputs;
    
    /**
     * Create the dialog content
     */
    TagGroup createContent(object self){
        inputs = NewTagList();
        tab_list = DLGCreateTabList(0);
        
        TagGroup box,tab;

        // panel 1
        box = DLGCreateBox("Panel 1");
        
        // input field
        input = DLGCreateStringField("ABC");
        box.DLGAddElement(input);
        // save the input field in a TagList,this creates the problem
        inputs.TagGroupInsertTagAsTagGroup(infinity(),input);
        
        tab = DLGCreateTab("Tab 1");
        tab.DLGAddElement(box);
        tab_list.DLGAddElement(tab);

        // panel 2
        box = DLGCreateBox("Panel 2");
        
        // add a label so both boxes have different heights
        box.DLGAddElement(DLGCreateLabel(""));
        
        // input field
        input = DLGCreateStringField("DEF");
        box.DLGAddElement(input);
        inputs.TagGroupInsertTagAsTagGroup(infinity(),input);
        
        tab = DLGCreateTab("Tab 2");
        tab.DLGAddElement(box);
        tab_list.DLGAddElement(tab);
        
        TagGroup wrapper = DLGCreateGroup();
        wrapper.DLGAddElement(tab_list);

        return wrapper;
    }

    object init(object self){
        return self.super.init(self.createContent())
    }
}

object dialog = alloc(TestDialog).Init();
dialog.pose();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...