首页 / 软件开发 / Silverlight / Silverlight - JavaScript API 中的属性和附加属性
Silverlight - JavaScript API 中的属性和附加属性2013-11-15 MSDN 附加属性是由 XAML 语言定义的概念,首先用在 WPF 中,随后也在 Silverlight 1.0 和 Silverlight 2 中使用。在 XAML 中,附加属性的用法很简单,并且在前面提到的技术中也很一致。当用在 JavaScript API 中时,运行时的附加属性访问要求使用不同的语法,这种语法对于 JavaScript API 是唯一的。此外,JavaScript API 具有两个实用工具方法,它们通常为 Silverlight 属性(包括附加属性)提供备选的属性-设置语法。本主题介绍为 JavaScript API 获取和设置属性和附加属性的语法,以及 GetValue/SetValue 实用工具方法的用法。GetValue 和 SetValueSilverlight 对象模型中的属性通过 object.property 表示法向 JavaScript 公开,这与许多其他在浏览器中进行编程的模型类似。由于它是基于原型的,因此您还可以在 JavaScript 中对于任何对象设置 API 中所没有的属性值,并随后获取该值。Silverlight 的 JavaScript API 还提供两个访问器方法,即 GetValue 和 SetValue,它们基于将相关的属性值作为字符串传递来获取或设置属性。这些方法实际上提供中间“包装”实现,以将 JavaScript 处理为 Silverlight 的本机对象,但这些方法作为一般用户 API 的一部分公开,因为它们偶而用于某些情形。当您遇到此类情形时,可以在 GetValue 和 SetValue 的参考页中参见示例用法。尽管如此,通常您不需要使用 GetValue / SetValue 方法。用于获取和设置属性的 object.property 表示法是等效的,并且通常更为直观。说明:如果您熟悉 WPF 或 Silverlight 的托管 API,您可能了解作为属性系统一部分的 GetValue 和 SetValue 方法。这些并不完全等效于 Silverlight JavaScript GetValue/SetValue。在 WPF 或 Silverlight 的托管 API 中,GetValue 和 SetValue 只能针对依赖项属性执行操作,而 GetValue/SetValue 可以对 JavaScript API 中可用的任何 Silverlight 属性执行操作。WPF 和托管代码中的附加属性对可用于 WPF 和托管代码的附加属性用法提供一些背景可能会很有用。在托管代码中,XAML 分析器使用发现模式来确定附加属性的访问器,以便处理值。发现模式基于名为 Get* 和 Set* 的方法,并在 XAML 语言规范中加以介绍(尽管其中并未介绍 WPF 实现的托管细节)。Silverlight 中的附加属性 (JavaScript API)对于 JavaScript API,XAML 分析器识别少量的附加属性:Canvas.LeftCanvas.TopCanvas.ZIndexStoryboard.TargetNameStoryboard.TargetPropertyGrid.ColumnGrid.ColumnSpanGrid.RowGrid.RowSpanXAML 分析器行为将附加属性名称视为一个完整字符串和一个刚好可在对象树中针对任何 UIElement 进行设置的离散属性。然而,这对于 JavaScript 访问将无效,因为附加属性名称中的点会在对象模型中触发一个步骤,并且假定父对象上不存在的一个中间对象/属性值 Canvas。JavaScript 的附加属性语法可以使用类似于 JavaScript 索引器语法的语法在 JavaScript 中为 Silverlight 设置附加属性:object["attachedPropertyName"],其中,attachedPropertyName 是定义附加属性的用点分隔的完整名称的字符串(例如,Canvas.Top)。另一种对待整个 attachedPropertyName 的方式是将其作为单个 attachedPropertyName 字符串的 DefiningClass.AttachedProperty 部分。还可以使用 GetValue/SetValue 来设置附���属性,尽管对于标准属性,GetValue/SetValue 用法实际上并不常用。此处应注意的最重要环节是:在 GetValue/SetValue 表示法和简化表示法中,.(点)被当作属性名称/标识符的一部分,必须位于引号内。下面的示例通过用法演示各种语法:// Set the value using the ["attachedPropertyName"] notation.
anObject["Canvas.Top"] = 40;
// Set the value using the SetValue method.
anObject2.setValue("Canvas.Top", 40);
// Get the value using the ["attachedPropertyName"] notation.
var top = anObject["Canvas.Top"];
// Get the value using the GetValue method.
var top2 = anObject2.GetValue("Canvas.Top");