创建向导页面

已完成

向导页面可指导用户完成安装过程。 向导页是从辅助设置中调用的。 要生成向导页面,需要将 PageType 属性设置为 NavigatePage

在客户端中,NavigatePage 页面没有操作栏。 页面底部显示一些按钮,允许用户选择返回下一步按钮,在不同步骤之间来回移动,直到选择结束按钮完成所有操作。

向导的目的是使用户能够配置设置,并仅在用户选择完成按钮时存储这些设置。 由于 Business Central 会从您离开输入字段的那一刻起自动存储所有修改,因此您需要将 SourceTableTemporary 属性设置为 true。 本设置确保修改仅存储于内存中,并且当用户选择完成按钮时,您可以将修改从内存复制到数据库。

构建辅助设置

本部分介绍创建辅助设置的基本任务, 允许您基本了解辅助设置指南的一般结构。 了解这一信息可以帮助您构建观感与 Microsoft 指南相似的辅助设置指南。 本部分提供一些基础 AL 代码,用于创建辅助设置指南涉及的各个步骤。

示例代码仅供参考,实际的实施过程可能与此不同。

  1. 创建辅助设置页面,例如:

    page 50100 ToDoAssistedSetup
    {
    PageType = NavigatePage;
    SourceTable = "To-do";
    SourceTableTemporary = true;
    Caption = 'Add a To-Do for the Team';
    }
    
  2. 设置以下属性:

    • PageType 属性 - 设置为 NavigatePage。

    • SourceTable - 设置为用于存储辅助设置数据的表的名称。

    • SourceTableTemporary - 设置为 true。 这是因为,一旦用户将焦点移动到另一个字段或关闭页面,Business Central 就会自动存储对数据库表所做的全部修改。 使用临时表,用户可以随时退出辅助设置指南,而无需将迄今所做的更改保存到数据库中。 相反,数据修改仅存储在内存中,直到运行代码,将数据传输到数据库。

    • Caption - 设置为想要在辅助指南每个步骤顶部显示的标题。

  3. 添加构成辅助设置的步骤。

    对于想要添加到指南的所有步骤,在根级别 layout > area(Content) 控件添加 group() 控件。 例如,以下代码可以添加三个步骤。

    layout
    {
        area(Content)
        {
            group(Step1)
            {
                Caption = '';
                InstructionalText = '';
                Visibility = Step1Visible;
            }
            group(Step2)
            {
                Caption = '';
                InstructionalText = '';
                Visibility = Step2Visible;
    
                field(Field2; "Field2")
                {
                    ApplicationArea = All;
                    Caption = '';
                }
            }
            group(Step3)
            {
                Caption = '';
                InstructionalText = '';
                Visibility = Step3Visible;
            }
        }
    }
    
    var
        Step1Visible: Boolean;
        Step2Visible: Boolean;
        Step3Visible: Boolean;
        Step: Option Start,Fill,Finish;
    
    local procedure EnableControls()
    begin
        ResetControls();
        case Step of
            Step::Start:
                ShowStep1();
            Step::Fill:
                ShowStep2();
            Step::Finish:
                ShowStep3();
        end;
    end;
    

    各个 group() 控件定义要为该步骤显示的内容,例如文本和数据输入字段。 例如,Caption 和 InstructionalText 属性用于添加文本。 对源表字段使用 field() 控件。

    group() 控件的顺序不一定决定辅助设置中的步骤顺序。 添加 AL 代码,定义每个步骤出现时的逻辑。

    可以在根级别 group() 控件中添加 group() 控件。 这些子组可用于调整步骤中的布局字段以及添加标题和说明文本。

    由于一次只能显示一个步骤,因此必须添加逻辑,以控制显示各个步骤的时间。 要控制可见性:

    • 对于每个步骤,定义全局布尔变量或步骤编号条件,然后将其应用到组的 Visible 属性。 该示例使用布尔变量 Step1VisibleStep2VisibleStep3Visible

    • 之后,您需要添加 AL 代码,更改这些变量,具体取决于用户正在使用的步骤。

    • 定义一个全局选项变量,其中每个步骤都对应一个值。

    • 代码中的这个变量用于跟踪哪个步骤处于活动状态。

    步骤内的多行字段不会显示灰色背景。 此行为允许您编写项目列表或任何需要新建行的格式化文本。

  4. 添加导航按钮。

    辅助设置的页面右下角通常会显示返回下一步完成按钮。 使用 action() 控件添加各个按钮。

    actions
    {
        area(Processing)
        {
            action(Back)
            {
                Enabled = BackEnable;
                InFooterBar = true;
                Image = PreviousRecord;
    
                trigger OnAction()
                begin
                    NextStep(true);
                end;
            }
            action(Next)
            {
                Enabled = NextEnable;
                InFooterBar = true;
                Image = NextRecord;
    
                trigger OnAction()
                begin
                    NextStep(false);
                end;
            }
            action(Finish)
            {
                Enabled = FinishEnable;
                InFooterBar = true;
                Image = Approve;
    
                trigger OnAction()
                begin
                    Finished();
                end;
            }
        }
    }
    
    var
        BackEnable: Boolean;
        NextEnable: Boolean;
        FinishEnable: Boolean;
    
    local procedure NextStep(Backwards: Boolean)
    begin
        if Backwards then
            Step := Step - 1
        else
            Step := Step + 1;
        EnableControls();
    end;
    
    local procedure Finished()
    begin
        StoreRecordVar();
        CurrPage.Close();
    end;
    
    • 将每个控件的 InFooterBar 属性设置为 true。

    • 如果该属性没有设置或为 false,则不会显示操作。

    • 与组的 Visible 属性类似,使用 Enabled 属性控制按钮何时在不同步骤中处于活动状态。 例如,“返回”在第一步中不处于活动状态,而“下一步”在最后一步中不处于活动状态。

    • 与组一样,为每个操作定义全局布尔变量,然后将该变量应用到操作的 Enabled 属性。 之后,全局变量由 AL 代码控制。

    • 要设置按钮样式,以匹配 Microsoft 基础应用程序中的其他辅助设置,请将返回按钮的 Image 属性设置为 PreviousRecord,下一步按钮的该属性设置为 NextRecord,完成按钮设置为 Approve

  5. 将数据从临时表传输到数据库表。 例如:

    var
         ToDoRec: Record "To-do";
    
     local procedure StoreRecordVar();
     begin
         ToDoRec.TransferFields(Rec, true);
         ToDoRec.Insert();
     end;
    

在本示例中,从用于操作的 Finished 过程调用 StoreRecordVar 过程。

添加标准横幅

您可能已经发现,基本应用程序和本文中的大多数辅助设置指南中的步骤标题下都包含两个不同横幅:齿轮和复选标记。 这些横幅基于 Media Repository 表中的以下图像文件:

  • AssistedSetup-NoText-400px.png 用于齿轮

  • AssistedSetupDone-NoText-400px.png 用于复选标记。

您可以在自定义辅助设置指南中重复使用这些图像,确保外观的一致性。

与步骤一样,要显示横幅,要将两个根级 group() 控件添加到 area(Content) 控件中。 field() 控件用于显示齿轮和复选标记图像。 以下片段说明了添加横幅的一种方法:

...
    layout
    {
        area(Content)
        {
            ...
            group(StandardBanner)
            {
                Caption = '';
                Editable = false;
                Visible = TopBannerVisible and not FinishActionEnabled;
                field(MediaResourcesStandard; MediaResourcesStandard."Media Reference")
                {
                    ApplicationArea = All;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(FinishedBanner)
            {
                Caption = '';
                Editable = false;
                Visible = TopBannerVisible and FinishActionEnabled;
                field(MediaResourcesDone; MediaResourcesDone."Media Reference")
                {
                    ApplicationArea = All;
                    Editable = false;
                    ShowCaption = false;
                }
            }
        }
    }
...
var
    ...
    MediaRepositoryDone: Record "Media Repository";
    MediaRepositoryStandard: Record "Media Repository";
    MediaResourcesDone: Record "Media Resources";
    MediaResourcesStandard: Record "Media Resources";

trigger OnInit();
begin
    ...
    LoadTopBanners();
end;

local procedure LoadTopBanners();
begin
    if MediaRepositoryStandard.Get('AssistedSetup-NoText-400px.png', Format(CurrentClientType())) and
        MediaRepositoryDone.Get('AssistedSetupDone-NoText-400px.png', Format(CurrentClientType()))
    then
        if MediaResourcesStandard.Get(MediaRepositoryStandard."Media Resources Ref") and
            MediaResourcesDone.Get(MediaRepositoryDone."Media Resources Ref")
    then
            TopBannerVisible := MediaResourcesDone."Media Reference".HasValue();
end;