Control.DefaultStyleKey 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取或设置引用控件的默认样式的键。 自定义控件的作者使用此属性更改其控件使用的样式的默认值。
protected:
property Platform::Object ^ DefaultStyleKey { Platform::Object ^ get(); void set(Platform::Object ^ value); };
IInspectable DefaultStyleKey();
void DefaultStyleKey(IInspectable value);
protected object DefaultStyleKey { get; set; }
Protected Property DefaultStyleKey As Object
属性值
引用控件的默认样式的键。 若要在主题样式查找过程中正常工作,此值应为 System.Type 值。
注意
Visual C++ 组件扩展 (C++/CX) 使用字符串,该字符串是类型的限定名称。 但这依赖于生成的代码,该代码在 XAML 编译器访问后生成 TypeName ;请参阅备注。
注解
DefaultStyleKey 是Windows 运行时 API 中为数不多的受保护属性之一。 它仅供控件作者使用,他们将对某些现有控件类进行子类化,因此具有设置此属性所需的访问权限。 对于要设置 DefaultStyleKey 的许多自定义控件方案,你还将重写 OnApplyTemplate。
DefaultStyleKey 的返回类型在语法中松散地作为 Object 类型化,但 XAML 样式系统将要求 值提供类型引用:
- 对于使用 C# 编写的逻辑的控件,DefaultStyleKey 的值应为 System.Type 的实例。 通常,在默认构造函数中设置此值:
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
- 对于使用 Microsoft Visual Basic 编写的逻辑的控件,DefaultStyleKey 的值应为 System.Type 的实例。 通常,在默认构造函数中设置此值:
Public Sub New()
Me.DefaultStyleKey = GetType(CustomControl1)
End Sub
CustomControl1::CustomControl1() // public: in the header.
{
DefaultStyleKey(winrt::box_value(L"App1.CustomControl1"));
}
- 对于使用 Visual C++ 组件扩展 (C++/CX) 编写的逻辑的控件,DefaultStyleKey 的值应该是命名空间限定的字符串,即自定义控件类的名称。 通常,在默认构造函数中设置此值:
CustomControl1::CustomControl1() //public: in the header
{
DefaultStyleKey = "App1.CustomControl1";
}
注意
最终,仅使用字符串不足以支持 Visual C++ 组件扩展 (C++/CX) 类型引用。 如果使用 解决方案资源管理器 中的“添加/新建项/模板化控件”选项,则模板和对 Visual C++ 组件扩展的支持 (C++/CX) 和 XAML 会生成提供 IXamlMetadataProvider 信息的类。 XAML 编译器可以在加载 XAML 时访问此代码,并使用它来验证和创建类型和成员以及联接分部类。 就你在自己的应用代码中定义的内容而言,只需使用字符串。 但是,如果你好奇,可以查看生成的 XamlTypeInfo.g.h 和 XamlTypeInfo.g.cpp 文件。
控件作者可以选择不为 DefaultStyleKey 提供值,但这并不常见。 结果是默认样式是基类定义的样式。 在某些情况下, (ContentControl) 值为 null。 即使选择不重新定义值,请确保原始默认样式可用于呈现控件。
加载 XAML 控件时,呈现过程将启动,并且系统正在查找要应用的正确模板,所加载的内容是控件的 XAML 默认样式,包括其模板。 包含在Windows 运行时是Windows 运行时定义的所有 XAML 控件的所有默认样式的内部副本。 DefaultStyleKey 中的类型引用告知系统要作为此样式加载哪个命名 XAML 资源。 在 XAML 形式中,样式确实由类型键控,即使Windows 运行时 XAML 中没有显式定义类型引用的机制。 但是,对于任何 TargetType 值(即保存查找键的属性),隐式假定它以字符串的形式表示类型引用。 例如, Button 中的 DefaultStyleKey 是 System.Type 实例,其中 名称 为“Button”, FullName 为“Windows.UI.Xaml.Controls.Button”。 系统使用此信息了解从具有 TargetType="Button"
的内部资源加载样式。
自定义控件通常不在默认 XAML 命名空间中。 相反,它们位于 XAML 命名空间中,该命名空间包含 一个 using: 语句来引用应用的代码命名空间。 默认情况下,项目创建前缀“local:”,用于映射此命名空间。 还可以映射其他 XAML 命名空间,以引用控件或应用定义的其他代码的其他代码命名空间。
当自定义控件在 XAML 中作为 TargetType 值时,“local:”前缀 (或其他一些映射到应用代码和命名空间的命名空间) 应位于自定义控件的名称之前。 启动模板也已为你完成此操作;添加新控件时,会看到仅包含一个样式的 generic.xaml 文件。 该样式将具有 TargetType 值,该值是一个以“local:”开头的字符串,由为自定义控件类选择的名称完成。 为了匹配前面在定义中 CustomControl1
设置 DefaultStyleKey 的示例,你将看到 starting generic.xaml 中定义的 元素 <Style TargetType="local:CustomControl1">
,该样式定义了控件模板以及设置其他属性。
注意
“local:”前缀独立于定义和使用它的 XAML。 XAML 命名空间和前缀仅在 XAML 中具有意义,并且对于每个 XAML 文件都是自包含的。 代码中的 DefaultStyleKey 值不包括前缀。