数据驱动独占活动主机

您可以使用列表数据源和 Data-Driven Exclusive Activity Host 从数据对象的内容中创建具有 Activities 的 UI 部分。例如,您可以在数据源中定义菜单的内容,并使用 Data-Driven Exclusive Activity Host 在您的应用程序中创建菜单。

../../_images/data-driven-exclusive-activity-host.gif

Data-Driven Exclusive Activity Host 一次只能激活其一个子 Activity。当一个 Data-Driven Exclusive Activity Host 的子 Activity 处于活动状态时,该 Activity Host 的所有其他 Activity 都处于非活动状态。例如,您可以使用 Data-Driven Exclusive Activity Host 在应用程序中切换视图。

通过完成教程,了解如何使用 Data-Driven Exclusive Activity Host。请参阅 教程:从数据源生成 UI。

../../_images/settingspanel-uicontrols.gif

使用数据源创建活动

使用数据源创建 Activities:

  1. 添加一个包含列表数据对象的数据源。

    要了解如何使用数据源,请参阅 使用数据源 和 教程:从数据源获取应用程序数据。

    例如:

    1. 在 Quick Start 窗口中,点击 Projects 并选择 Tutorials 选项卡。在 Data source 教程旁边,点击 下载。

    2. 在 Library 中右键单击 Kanzi Engine Plugins,选择 Import Kanzi Engine Plugin,然后导入 <KanziWorkspace>/Tutorials/Data sources/Completed/Application/lib/Win64/GL_vs2022_Release_DLL/XML_data_source.dll。

      ../../_images/import-kanzi-engine-plugin.png
    3. 在 Window 主菜单中,选择 Data Sources 以打开 Data Sources 窗口。

      使用 Data Sources 窗口在您的项目中创建、设置和删除数据源,并将数据源中的数据对象连接到项目中的节点和资源。

      ../../_images/window-data-sources.png
    4. 在 Data Sources 窗口中,点击 Create Data Source,输入此数据源的名称,然后点击 OK 以创建数据源。

      ../../_images/create-data-source.png ../../_images/create-data-source-settings.png
    5. 在您刚创建的数据源旁边的 Data Sources 窗口中,单击 快速编辑,并将 XML Data Source File 属性设置为使用 XML 文件作为数据源。

      ../../_images/data-sources-settings.png

      例如,将此数据保存为 XML 文件,并将数据源设置为使用该文件。

      <Settings type="list">
          <items>
              <Menu>
                  <Name type="string">WINDOWS</Name>
                  <Settings type="list">
                      <items>
                          <Setting>
                              <Name type="string">Front left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Front right</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back right</Name>
                          </Setting>
                      </items>
                  </Settings>
              </Menu>
              <Menu>
                  <Name type="string">MIRRORS</Name>
                  <Settings type="list">
                      <items>
                          <Setting>
                              <Name type="string">Rearview</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Side left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Side right</Name>
                          </Setting>
                      </items>
                  </Settings>
              </Menu>
              <Menu>
                  <Name type="string">LIGHTS</Name>
                  <Settings type="list">
                      <items>
                          <Setting>
                              <Name type="string">Ceiling</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back right</Name>
                          </Setting>
                      </items>
                  </Settings>
              </Menu>
              <Menu>
                  <Name type="string">SEATS</Name>
                  <Settings type="list">
                      <items>
                          <Setting>
                              <Name type="string">Heating left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Heating right</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back left</Name>
                          </Setting>
                          <Setting>
                              <Name type="string">Back right</Name>
                          </Setting>
                      </items>
                  </Settings>
              </Menu>
          </items>
      </Settings>
      
    6. 在数据源旁边的 Data Sources 中,单击 重新加载数据源。

      通过这种方式,您可以从数据源加载数据并创建数据对象。数据驱动的独占活动主机使用这些数据对象生成活动。

      ../../_images/data-sources-create.png ../../_images/data-sources-settings-data-source.png
  2. 创建一个模板,Data-Driven Exclusive Activity Host 使用该模板从列表数据源生成活动。

    例如:

    1. 在 Prefabs 中,点击 create-prefab 并选择 Activity 2D。在 Activity 2D 预设中创建一个包含 Text Block 2D 节点和 Grid List Box 2D 节点的 Stack Layout 2D 节点。

      ../../_images/ddeah-activity-prefab.png
    2. 在 Prefabs 中,点击 create-prefab,选择 Empty Node 2D。在 Empty Node 2D 预设中创建一个 Text Block 2D 节点。

      Activity 2D 预设中的 Grid List Box 2D 节点使用此预设来显示来自数据源的菜单内容。

      ../../_images/ddeah-activity-prefab-empty-node.png
    3. 在 Activity 2D 预设中的 Prefabs 中,选择 Text Block 2D 节点。从 Data Sources 中,将 Settings > Item > Menu > Name 数据对象拖到 Properties 上,并将其放在 Text 属性上。

      通过这种方式,您可以将 Text Block 2D 节点设置为显示来自 Settings > Item > Menu > Name 列表数据对象的设置菜单名称。

      ../../_images/ddeah-activity-text-block.png ../../_images/data-sources-menu-name.png ../../_images/ddeah-activity-text-block-text-binding.png
    4. 在 Activity 2D 预设中的 Prefabs 中,选择 Grid List Box 2D 节点。从 Data Sources 中拖动 Settings > Item > Menu > Settings 列表数据对象到 Properties,并将其放在 Items Source 属性上。

      通过这种方式,您可以将 Grid List Box 2D 节点设置为显示来自 Settings > Item > Menu > Settings 列表数据对象的项目。

      ../../_images/ddeah-activity-grid-list-box.png ../../_images/data-sources-menu-settings.png ../../_images/ddeah-activity-grid-list-box-items-source-binding.png
    5. 在 Activity 2D 预设中的 Prefabs 中,选择 Grid List Box 2D 节点。在 Properties 中添加并设置:

      • Cell Width 到 200

      • Cell Height 到 40

      • Layout Width 200

      • Layout Height 到 200。

      • Item Template 到 Empty Node 2D 预设

        使用 Item Template 属性,您可以设置要为其列表中的项目使用哪个预设模板的 Grid List Box 节点。

      要了解如何使用 Grid List Box,请参阅 使用 Grid List Box 节点 和 教程:使用 Grid List Box 创建联系人列表。。

      ../../_images/ddeah-activity-grid-list-box-properties.png
    6. 在 Empty Node 2D 预设中的 Prefabs 中,选择 Text Block 2D 节点。从 Data Sources 中拖动 Settings > Item > Menu > Settings > Item > Setting > Name 数据对象到 Properties,并将其放在 Text 属性上。

      通过这种方式,您可以将 Text Block 2D 节点设置为显示 Settings > Item > Menu > Settings 列表数据对象中的每个项目在设置菜单中。

      ../../_images/ddeah-empty-node-text-block.png ../../_images/data-sources-menu-settings-setting-name.png ../../_images/ddeah-empty-node-text-block-text-property.png
  3. 创建并设置一个 Data-Driven Exclusive Activity Host:

    1. 在 Activity Browser 中,点击 add-button 并创建一个 Data-Driven Exclusive Activity Host 节点。

      Kanzi Studio 在 Screen 节点下创建一个 Data-Driven Exclusive Activity Host 节点。

      ../../_images/activity-browser-create-root-ddeah.png ../../_images/node-tree-root-ddeah.png
    2. 在 Node Tree 中,选择您创建的 Data-Driven Exclusive Activity Host 节点。在 Properties 中,添加并设置 Data Context > Data Context 属性为您在项目中创建的数据源。

      ../../_images/node-tree-root-ddeah.png ../../_images/properties-ddeah.png
    3. 在 Node Tree 中,选择 Data-Driven Exclusive Activity Host。在 Properties 中,点击 + Add Binding,并在 Binding Editor 中设置:

      • Property 到 Activity Source

      • 将 Expression 到您希望 Data-Driven Exclusive Activity Host 用于创建活动的数据对象。

        例如,将 Expression 设为

        {DataContext.Settings}
        

      单击 Save。

      ../../_images/binding-editor-ddeah.png
    4. 在 Properties 中,添加并设置:

      • 将 Activity Template 到您之前创建的 Activity 2D 预设。

        数据驱动独占活动主机使用此预设来创建活动。

      • Active Activity Index 到列表数据对象中您希望 Data-Driven Exclusive Activity Host 用于在应用程序激活此数据驱动的独占活动主机时创建活动的项目。

        Active Activity Index 属性的值是从零开始的,表示数据源中列表数据对象中的位置,数据驱动的独占活动主机使用该位置来创建活动。值 -1 表示该数据驱动的独占活动主机中没有活动处于激活状态。

      ../../_images/properties-ddeah-activity-template.png ../../_images/preview-create-ddeah-complete.png

要了解如何激活和在 Data-Driven Exclusive Activity Host 从数据源创建的活动之间导航,请参阅 激活活动。

在 Data-Driven Exclusive Activity Host 中控制活动持久性

默认情况下,当您停用一个活动时,Kanzi 会将该活动从节点树中分离,并删除该活动实例。

使用 Keep Activity Alive 属性,您可以在 Kanzi 停用该活动时控制活动持久性。

要控制活动持久性,请在 Activity Browser 或 Prefabs 中,选择您要控制其持久性的活动。在 Properties 中,添加 Keep Activity Alive 属性并将其设置为:

  • Detach and Destroy。Kanzi 将该活动从节点树中分离,并删除该活动实例。这是默认值。

  • Hide and Disable。Kanzi 隐藏并禁用该活动,而不是销毁它。当您再次激活该活动时,Kanzi 会恢复隐藏的活动并显示同一活动。该节点保持停用前的相同状态,即使您为该活动禁用了虚拟化也是如此。

    这样,再次激活该活动时可以跳过活动实例化。

../../_images/properties-keep-alive.png

激活活动

当您激活一个活动时,Kanzi:

  1. 使用其预设创建一个 Activity 节点。

  2. 将 Activity 节点附加到节点树。

  3. 使活动可见。

  4. 如果活动主机具有按键焦点且未进行其他配置,则将按键焦点设置为活动。控制是否将焦点设置到激活的 Activity。。

您可以:

小技巧

要模拟活动的激活,在 Activity Browser 中选择 Data-Driven Exclusive Activity Host,并在侧面板中调整 Active Activity Index 属性的值。

使用 Active Activity Index 属性来告知数据驱动的独占活动主机您要在列表数据对象中创建的项目。

当您在 Activity Browser 中设置 Active Activity Index 属性的值时,您更改了此属性的运行时值。当您重新启动 Preview 或您的应用程序时,数据驱动的独占活动主机会读取您在 Properties 中或使用触发器和操作设置的 Active Activity Index 属性的值。

../../_images/ab-activityitemindex.png

找出哪个 Activity 处于活动状态

要找出哪个 Activity 在 Data-Driven Exclusive Activity Host 中处于活动状态,请检查该 Data-Driven Exclusive Activity Host 中 Active Activity Index 的值。

Active Activity Index 属性的值是从零开始的,表示数据源中列表数据对象中的位置,数据驱动的独占活动主机使用该位置来创建活动。值 -1 表示该数据驱动的独占活动主机中没有活动处于激活状态。

激活下一个或上一个 Activity。

当您想在数据驱动的独占活动主机中的活动之间创建导航时,使用 Navigate To Next Activity 或 Navigate To Previous Activity 操作。

要激活下一个或上一个 Activity:

  1. 创建并设置一个 Data-Driven Exclusive Activity Host。请参阅 使用数据源创建活动。

    ../../_images/preview-create-ddeah-complete.png
  2. 创建带有触发器的节点,您要使用该触发器来激活 Data-Driven Exclusive Activity Host 从数据源创建的下一个和上一个活动。

    例如,创建 Button 节点并使用 Button: Click 触发器。

    ../../_images/node-tree-ddeah-previous.png ../../_images/node-components-button-click1.png
  3. 在 Node Tree 中,选择您在上一步中创建的节点之一。在 Node Components > Triggers 中,按 Alt 并右键单击 您要用于激活 Activity 的触发器,选择 Navigate To Next Activity 或 Navigate To Previous Activity 操作,然后在操作集中:

    • Target Item 到 Data-Driven Exclusive Activity Host 节点之间,您希望在其活动之间进行导航。

    • (可选) 要在到达该 Data-Driven Exclusive Activity Host 中的最后一个或第一个活动后触发触发器时激活第一个或最后一个活动,请将 Loop Activity 属性设置为启用。

    ../../_images/node-components-navigate-to-previous-activity.png ../../_images/node-components-navigate-to-previous-activity-configure.png

要激活活动,请在 Preview 中单击您创建的按钮。

../../_images/preview-ddeah-previous-loop.gif

使用设置属性操作激活活动

当您知道数据对象在列表数据对象中的位置,并且数据驱动的独占活动主机从中创建活动时,使用带有 Set Property 操作的触发器。

要使用 Action 激活 Activity:

  1. 创建并设置一个 Data-Driven Exclusive Activity Host。请参阅 使用数据源创建活动。

    ../../_images/preview-create-ddeah-complete.png
  2. 创建带有触发器的节点,您要使用该触发器来激活 Data-Driven Exclusive Activity Host 从数据源创建的下一个和上一个活动。

    例如,创建 Button 节点并使用 Button: Click 触发器。

    ../../_images/node-tree-ddeah-windows.png ../../_images/node-components-button-click1.png
  3. 在 Node Tree 中,选择您在上一步中创建的节点之一。在 Node Components > Triggers 中,按 Alt 并右键单击 您要用于激活 Activity 的触发器,选择 Set Property 操作,并设置:

    • Target Item 到您想要激活活动的 Data-Driven Exclusive Activity Host。

    • Target Property 到 Active Activity Index

      Active Activity Index 属性的值是从零开始的,表示数据源中列表数据对象中的位置,数据驱动的独占活动主机使用该位置来创建活动。值 -1 表示该数据驱动的独占活动主机中没有活动处于激活状态。

    • Value From 到您要用于 Data-Driven Exclusive Activity Host 中 Active Activity Index 属性值的源:

      • 要使用静态值,请参阅 Fixed value。

        在 Fixed Value 属性中,设置该值。

      • Message argument 从消息中获取值。

        在 Message Argument 和 Message Argument Field 属性中,设置消息参数以获取值。

      • Property 从属性中获取值。

        在 Source Item、Source Property 和 Source Property Field 属性中,设置值来源的节点和属性。

      例如,将 Value From 设置为 Fixed value,并将 Fixed Value 属性设置为 0。

      这样,当触发器被触发时,数据驱动的独占活动主机会从其使用的数据源的第一个数据对象创建一个活动。

    ../../_images/add-set-property.png ../../_images/node-components-set-property-ddeah.png

要激活活动,请在 Preview 中单击您创建的按钮。

../../_images/preview-ddeah-set-property.gif

使用应用属性操作激活活动

当您知道数据对象在列表数据对象中的位置,并且数据驱动的独占活动主机从中创建活动时,您可以在满足条件时创建活动。为此,使用 Data Trigger 和 Apply Property Action。

例如,使用此方法创建并激活一个 Activity,该 Activity 仅在满足显示该警告的条件时显示警告。

使用 Data Trigger 时,请记住,Data Trigger 的动作优先于任何其他触发器的动作。

当满足条件时激活一个 Activity:

  1. 创建并设置一个 Data-Driven Exclusive Activity Host。请参阅 使用数据源创建活动。

    ../../_images/preview-create-ddeah-complete.png
  2. 创建一个数据对象,您可以使用该对象来控制哪个 Activity 处于活动状态:

    1. 在文本编辑器中,添加到 Data-Driven Exclusive Activity Host 用于创建活动的 Settings.xml 文件中:

      <Active>
          <Setting type="int">0</Setting>
      </Active>
      
    2. 在数据源旁边的 Data Sources 中,单击 重新加载数据源。

      ../../_images/data-sources-condition.png
  3. 设置条件:

    1. 在 Node Tree 中,创建或选择要设置条件的节点。在 Node Components 中,按 Alt 并右键单击 Triggers 并选择 Data Trigger。

      例如,在您想要激活一个活动的 Data-Driven Exclusive Activity Host 中,创建一个 Data Trigger。

      ../../_images/apply-activation-create-data-trigger.png
    2. 在 Data Trigger 中,设置条件。

      例如,创建一个表达式,将预期值与来自数据源的值进行比较。

      {DataContext.Active.Setting}==0
      
      ../../_images/node-components-data-trigger-condition.png
  4. 在 Node Components > Triggers 中,将您在上一步中创建的 按 Alt 并右键单击 Data Trigger 中,选择 Apply Property Action,并在操作集中:

    • Target Item 到您想要激活活动的 Data-Driven Exclusive Activity Host。

    • Target Property 到 Active Activity Index

      Active Activity Index 属性的值是从零开始的,表示数据源中列表数据对象中的位置,数据驱动的独占活动主机使用该位置来创建活动。值 -1 表示该数据驱动的独占活动主机中没有活动处于激活状态。

    • Value From 到您要用于 Data-Driven Exclusive Activity Host 中 Active Activity Index 属性值的源:

      • 要使用静态值,请参阅 Fixed value。

        在 Fixed Value 属性中,设置该值。

      • Message argument 从消息中获取值。

        在 Message Argument 和 Message Argument Field 属性中,设置消息参数以获取值。

      • Property 从属性中获取值。

        在 Source Item、Source Property 和 Source Property Field 属性中,设置值来源的节点和属性。

      例如,将 Value From 设置为 Fixed value,并将 Fixed Value 属性设置为 0。

      当 Expression 计算为 True 时,Data Trigger 保持在应用于 Active Activity Index 属性的 Apply Property Action 中的值。这样,数据驱动的独占活动主机就会从该索引处的列表数据对象中创建并激活一个活动。

    ../../_images/node-components-data-trigger-create-apply-property.png ../../_images/node-components-data-trigger-apply-property-0.png
  5. (可选) 重复前两个步骤以为其他活动创建条件。

    ../../_images/node-components-data-trigger-apply-property-1.png ../../_images/node-components-data-trigger-apply-property-2.png ../../_images/node-components-data-trigger-apply-property-3.png

要设置哪个 Activity 处于活动状态,请在文本编辑器中编辑您在此过程中添加的 Active > Setting 数据对象的值,并保存文件。设置数据对象的值,以便与 Data Trigger 条件表达式中的值进行比较。

../../_images/preview-ddeah-apply-property.gif

在 API 中使用 Activities

有关详细信息,请参阅 Activity2D、Activity3D、DataDrivenExclusiveActivityHost2D 和 DataDrivenExclusiveActivityHost3D 类。

另请参阅

教程:构建应用程序 UI

教程:控制应用程序 UI

教程:从数据源生成 UI