属性系统

属性提供了指定和检查节点的状态、外观和行为的手段。例如,属性可以定义颜色、指示按钮是否被按下或指定项目的对齐方式。

您可以通过在 Kanzi Studio 中设置属性值并在代码中访问它们来使用属性,而无需了解属性系统的工作原理。然而,要充分利用 Kanzi 属性系统的功能,您必须熟悉属性系统的工作原理。

属性提供了一种统一的方式来访问 Kanzi 节点的数据,以便许多 Kanzi 子系统可以操作这些数据。这样,您可以,例如,动画化属性值,提供属性值之间的绑定,并监控属性值的变化。

任何属性值都可以受到多个输入源的影响。属性系统定义了解决所有输入中的属性值的规则,并解析当前值。例如,您可以直接设置属性的值,属性可以有默认值,样式可以影响属性值,动画和状态管理器可以修改属性值。通过提供自动应用的规则,属性系统最大限度地减少了您必须手动更改值的地方。

属性数据类型

每个属性由一个属性类型描述。属性类型唯一描述了属性的使用位置和属性名称。数据类型定义了属性可以保存的值的类型。

例如,Node::VisibleProperty 属性类型用于控制节点的可见性,并在 Node 类及其派生类中使用。您可以使用其名称(Node::VisibleProperty)在运行时查找属性类型。由于该属性的数据类型为布尔型,它接受的值为 true 或 false。

在 Kanzi Studio 中,您可以拥有更专业的属性类型,但它们的表示仅来自可用的数据类型。请参阅 创建属性类型。

例如,即使枚举值将值的范围限定为枚举中定义的条目,但仍用整数值表示它们。

属性的使用方法

大多数 Kanzi 属性是在使用它们的类中定义的。您可以使用这些属性来设置您设置属性的对象的外观、状态或行为。

例如:

  • 在 Text Block 节点中,Text 属性定义了节点显示的文本。

  • Visible 属性控制节点及其所有子节点的可见性。

然而,一些 Kanzi 属性配置其他对象的外观、行为或状态。

例如:

  • 材质可以定义 Diffuse Color 属性,您可以将其分配给使用该材质的节点。

  • Grid Layout 定义了 Row 和 Column 属性,但您需要在 Grid Layout 节点的子节点中设置它们,而不是在 Grid Layout 节点中。

在 Kanzi 中,这些属性被称为附加属性。

默认属性值

每种属性类型定义该属性的默认值。当查询时,Kanzi 返回默认值,除非您通过样式、继承等直接或间接地设置属性值。使用默认值可以在应用程序开发期间节省时间。

例如,Visible (Node::VisibleProperty) 属性的默认值是 true。默认情况下,所有节点都是可见的。

或者,对有些属性类型而言,没有属性值是一种条件。

例如,Layout Width (Node::WidthProperty) 和 Layout Height (Node::HeightProperty) 属性允许您设置节点的大小:

  • 通过将这些属性设置为 100 像素,您将节点的大小强制为 100 x 100 像素。

  • 如果不设置这些属性,您将让节点自行决定其大小。

    例如,Image 节点可以根据其显示的图像决定其大小,或者 Stack Layout 节点可以决定为其所有项目的大小。

可继承的属性类型

每个属性类型定义该属性的值是否可继承。一个节点从其祖先节点继承可继承属性类型的值。

例如,Node::FontFamilyProperty 是一种可继承的属性类型。当您想为所有可以显示文本的控件使用相同的字体系列时,只需在节点树的最顶层设置 Font Family 属性。Kanzi 会将相同的字体应用于所有子节点。如果您想在某个子节点中使用不同的字体,请在该节点中添加 Font Family 属性,并将其设置为您想使用的字体系列。

属性优先级

查询属性值会生成一项结果,而确定值时,属性系统会评估可影响属性值的多个源。属性值源是按特定顺序进行评估的。

../_images/property-precedence.svg

Kanzi Engine 根据以下优先级规则(优先级从高到低)解析运行时值:

属性类型更改标志

在 Kanzi 中,每种属性类型可以有一个或多个更改标志,以指示更改该属性值的影响。

例如:

  • PropertyTypeChangeFlag::PropertyTypeChangeFlagMeasure 标志由影响节点自身报告的大小的属性类型使用,或影响该节点相对于其他节点的大小和位置。

    例如,Layout Width (Node::WidthProperty) 属性具有此更改标志。当节点中 Layout Width 属性的值发生变化时,Kanzi:

    1. 重新测量该节点。

    2. 如果节点的测量大小发生变化,则测量节点的父节点、父节点的父节点,依此类推。

    3. 重新排列节点、其已更改的祖先节点及其后代的布局。

    4. 对于那些变换发生变化的节点,重新计算变换。

    5. 绘制所有节点。

  • PropertyTypeChangeFlag::PropertyTypeChangeFlagRender 标志由更改2D节点渲染参数但不影响布局的属性类型使用。

    例如,Render Transformation (Node2D::RenderTransformationProperty) 属性具有此更改标志。当节点中 Render Transformation 属性的值发生变化时,Kanzi:

    1. 重新计算节点及其子节点的变换。

    2. 绘制所有节点。

  • PropertyTypeChangeFlag::PropertyTypeChangeFlagDraw 标志由影响节点绘制的属性类型使用。

    例如,大多数材质属性使用此标志。当此类属性的值在节点中更改时,Kanzi 绘制所有节点。

在 Kanzi Engine API 参考中,请参阅 PropertyTypeChangeFlag。

另请参阅

创建属性类型

使用 styles

状态机 (State Manager)

触发器 (Triggers)

动画 (Animations)

在 Java 中使用属性

在 Lua 中使用属性