属性系统¶
属性提供了指定和检查节点的状态、外观和行为的手段。例如,属性可以定义颜色、指示按钮是否被按下或指定项目的对齐方式。
您可以通过在 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 属性,并将其设置为您想使用的字体系列。
属性优先级¶
查询属性值会生成一项结果,而确定值时,属性系统会评估可影响属性值的多个源。属性值源是按特定顺序进行评估的。
Kanzi Engine 根据以下优先级规则(优先级从高到低)解析运行时值:
Modified value
动画和绑定会修改,状态会覆盖该值。请参阅 动画 (Animations)、修饰符绑定 和 状态机 (State Manager)。
本地值
本地值是您直接设置的属性值。在 Kanzi Studio 中,节点中的所有属性都由本地值定义。您可以使用操作、值源绑定和 Kanzi Engine API 设置本地值。
使用 Kanzi Engine API,您可以设置本地属性值:
PropertyObject::setProperty函数。例如,要将 Visible 属性的值设置为 false,使用
node.setProperty(Node::VisibleProperty, false)
大多数类提供的辅助函数。
例如,您可以使用
Node::setVisible函数设置Node::VisibleProperty属性。有关辅助函数,请参阅定义该属性的类的参考资料。
请参阅 值源绑定 和 触发器 (Triggers)。
Named style
Kanzi 将命名样式应用于所有其 Style 属性值指向该样式的节点。
请参阅 应用样式到节点类型的选定实例。
Typed style
Kanzi 将类型化样式应用于您在样式中指定的所有类型的节点。
请参阅 应用样式到节点类型的选定范围。
继承值 (如果该属性是可继承的)
每个属性类型会指定该属性是否可继承。只有某些值可以从祖先继承。
请参阅 可继承的属性类型。
默认值和类默认值
所有属性在其元数据中都有一个默认值定义。Kanzi 使用默认值,如果没有其他因素影响该值。每个继承该属性类型的类都可以覆盖其默认值。
例如:
Horizontal Alignment (
Node::HorizontalAlignmentProperty) 属性的默认值是 Center (Node::HorizontalAlignment::HorizontalAlignmentCenter)。Node2D类将 Horizontal Alignment 属性的默认值重写为 Left (Node::HorizontalAlignment::HorizontalAlignmentLeft)。
请参阅 默认属性值。
属性类型更改标志¶
在 Kanzi 中,每种属性类型可以有一个或多个更改标志,以指示更改该属性值的影响。
例如:
PropertyTypeChangeFlag::PropertyTypeChangeFlagMeasure标志由影响节点自身报告的大小的属性类型使用,或影响该节点相对于其他节点的大小和位置。例如,Layout Width (
Node::WidthProperty) 属性具有此更改标志。当节点中 Layout Width 属性的值发生变化时,Kanzi:重新测量该节点。
如果节点的测量大小发生变化,则测量节点的父节点、父节点的父节点,依此类推。
重新排列节点、其已更改的祖先节点及其后代的布局。
对于那些变换发生变化的节点,重新计算变换。
绘制所有节点。
PropertyTypeChangeFlag::PropertyTypeChangeFlagRender标志由更改2D节点渲染参数但不影响布局的属性类型使用。例如,Render Transformation (
Node2D::RenderTransformationProperty) 属性具有此更改标志。当节点中 Render Transformation 属性的值发生变化时,Kanzi:重新计算节点及其子节点的变换。
绘制所有节点。
PropertyTypeChangeFlag::PropertyTypeChangeFlagDraw标志由影响节点绘制的属性类型使用。例如,大多数材质属性使用此标志。当此类属性的值在节点中更改时,Kanzi 绘制所有节点。
在 Kanzi Engine API 参考中,请参阅 PropertyTypeChangeFlag。