第3章 Kanzi Studio入门:Kanzi架构介绍、工程创建与管理、UI组件树与属性面板、资源管理器使用

3.1 Kanzi整体架构:先搞清楚它怎么工作的

说实话,我第一次接触Kanzi的时候,也被它的架构绕晕过。后来我总结了一句话:Kanzi本质上是一个“数据驱动”的UI框架。什么意思呢?就是你不用像写Android那样,在代码里硬编码每个控件的位置和状态。你只需要定义好“数据模型”,然后告诉Kanzi:“当这个数据变了,那个控件就跟着变”。

Kanzi的架构分三层:

  • 应用层:就是你看到的UI界面,按钮、图片、文字这些。
  • 逻辑层:处理交互逻辑,比如点击按钮后切换页面。
  • 数据层:管理车辆信号、状态数据,比如车速、空调温度。

我个人习惯把这三层想象成一个“三层蛋糕”。数据层是底部的蛋糕胚,逻辑层是中间的奶油,应用层是顶上的水果装饰。你想想看,如果蛋糕胚歪了,上面的水果再好看也没用。所以做Kanzi开发,数据模型的设计才是关键

核心要点:Kanzi的UI组件(比如按钮、图片)本身不存储数据。它们只是“显示者”。数据存储在“数据模型”里,UI通过“绑定”来读取和更新数据。这个设计理念,和Qt的Model/View架构很像。

3.2 工程创建与管理:从零开始搭一个项目

打开Kanzi Studio,你会看到一个欢迎界面。别急着点“新建”,先想清楚你的项目要做什么。我在项目中遇到过好几次,一上来就开干,结果做到一半发现工程结构乱成一锅粥,改起来想死的心都有。

创建工程的步骤很简单:

  1. 点击 File → New → Kanzi Project
  2. 输入项目名称,比如 MyHMI_Demo
  3. 选择模板。新手建议选 Empty Application,从零开始学得快。
  4. 设置保存路径。嗯,这里要注意:路径不要有中文和空格,否则编译时会报一些莫名其妙的错。

创建完成后,你会看到这样的目录结构:

MyHMI_Demo/
├── Assets/          # 存放图片、字体、3D模型等资源
├── Config/          # 配置文件,比如屏幕分辨率
├── Prefabs/         # 预制体,可以复用的UI组件
├── Scenes/          # 场景文件,每个场景就是一个页面
├── Scripts/         # 逻辑脚本(如果你用C#或Lua)
└── KanziProject.kzproj  # 工程文件,双击打开

我个人习惯把 Assets 再细分一下:ImagesFontsModels。这样找资源的时候不用大海捞针。

小技巧:Kanzi的工程文件(.kzproj)本质上是XML格式。如果你遇到工程打不开的情况,可以用文本编辑器打开看看,有时候是路径引用出了问题。

3.3 UI组件树:你的界面就是一棵树

Kanzi里所有的UI元素,都组织在一棵 组件树(Node Tree) 里。说白了,就像你电脑里的文件夹结构一样。根节点是 Screen,下面挂各种容器(Container)、按钮(Button)、图片(Image)等等。

举个例子,一个简单的仪表盘界面:

Screen (根节点)
├── Background (Image)
├── SpeedContainer (Container)
│   ├── SpeedDial (Image)      # 速度表盘
│   └── SpeedNeedle (Image)    # 速度指针
├── InfoPanel (Container)
│   ├── TemperatureText (TextBlock)
│   └── FuelLevelBar (ProgressBar)
└── BottomBar (Container)
    ├── HomeButton (Button)
    └── SettingsButton (Button)

为什么要用树结构?因为 父子关系决定了渲染顺序和事件传递。比如,你点击 HomeButton,事件会先传到 BottomBar,再传到 Screen。如果父容器把事件“吃掉”了,子按钮就收不到点击事件。我曾经在这个坑里爬了整整一天——一个按钮怎么点都没反应,最后发现是父容器把触摸事件拦截了。

避坑指南:组件树的层级不要太深。我建议最多不超过5层。层级太深,性能会下降,而且调试起来特别痛苦。你想想看,一个按钮藏在第8层,找它都要翻半天。

3.4 属性面板:每个组件的“身份证”

选中组件树里的任意一个节点,右侧的 属性面板(Properties Panel) 就会显示它的所有属性。这里我重点说几个常用的:

属性名 作用 我的经验
Name 组件的名字,方便查找 命名要有规律,比如 btn_Homeimg_SpeedDial
Layout 位置和大小(x, y, width, height) 尽量用相对布局,别写死像素值
Background 背景颜色或图片 透明背景记得勾选 IsTransparent
Input 是否可交互(点击、拖拽) 不需要交互的组件,关掉它,省性能
Render 渲染相关,比如透明度、旋转 透明度动画用这个调,别用代码硬写

嗯,这里要注意:属性面板里改的值,会直接覆盖掉你之前设置的默认值。如果你发现某个组件显示不正常,先看看属性面板里是不是被改了什么奇怪的值。

3.5 资源管理器:你的素材仓库

资源管理器(Resource Manager)在界面的左下角。所有你用到的图片、字体、3D模型、音频文件,都在这里管理。我刚开始用Kanzi的时候,犯过一个低级错误:直接把图片拖到场景里用,结果后来图片换了路径,整个工程都报错。

正确的做法是:

  1. 把图片复制到工程的 Assets/Images 文件夹里。
  2. 在Kanzi Studio里,右键点击资源管理器 → Import Resources
  3. 选择图片,导入后它会出现在资源管理器里。
  4. 从资源管理器拖到场景中使用。

这样做的好处是:Kanzi会自动管理资源的引用关系。你换图片的时候,只需要在资源管理器里替换文件,所有用到这张图片的地方都会自动更新。省心吧?

小技巧:资源管理器支持 批量导入。如果你有一套图标(比如50个),全选一起拖进去就行。Kanzi会自动按文件名生成资源ID,方便你在代码里引用。

3.6 实战小练习:创建一个简单的仪表盘界面

光说不练假把式。我们来动手做一个最简单的仪表盘:

  1. 新建工程,选 Empty Application
  2. 在组件树里,右键 ScreenAdd Container,命名为 MainContainer
  3. MainContainer 下,添加一个 Image,导入一张表盘图片。
  4. 再添加一个 TextBlock,显示车速数字,比如 “120”。
  5. 选中 TextBlock,在属性面板里调整字体大小和颜色。

做完这些,按 F5 预览。你会看到一个静态的仪表盘。虽然它还不能动,但你已经掌握了Kanzi最核心的操作流程:建组件 → 调属性 → 看效果

我个人觉得,Kanzi入门最难的不是操作,而是转变思维——从“写代码控制UI”变成“搭积木一样搭UI”。一旦你接受了这个设定,后面的学习就会顺畅很多。

好,这一章就到这里。下一章我们会深入 Kanzi的绑定系统,让你的仪表盘真正“动”起来。