<CustomObject>
Direct content example 1
</CustomObject>
<!-- or -->
<CustomObject>
<Button Content="Direct content example 2" />
</CustomObject>
接下来,您需要使用ContentPropertyAttribute
,它可以告诉WPF在您编写以下XAML时实际设置的属性是哪个。
该属性可按如下方式使用:
[ContentProperty("NameOfProperty")]
public class CustomObject
{
[...]
ContentControl
使用此属性设置 Content 属性,但请注意,该属性可以被称为任何名称;例如,WPF 的 TextBox
使用此属性设置 Text
属性。
例如:
[ContentProperty("Text")]
该属性也不必是依赖属性(请参阅MSDN文档示例以证明此点)。
最后,此属性特定于xaml解析器,而不是ContentControl
,可以与任何类型一起使用,这可以从上面的TextBox
示例中看出(TextBox
不派生自ContentControl
)。
如果可能的话,请保持自定义控件属性名称与内置控件属性名称相同,而不改变其含义。
例如,如果您有一个名为CustomerDisplayer的自定义控件,请不要将客户列表称为“Customers”,而应该称为“ItemsSource”。
这可能会在一开始时看起来违反直觉,但从长远来看,它可以节省很多麻烦,因为未来的程序员可以对名为“ItemsSource”的属性做出许多假设,而对于“Customers”属性,他们不能必然地做出这些假设。
确保控件可以重新进行样式和模板的设计而不改变控件的操作方式。不要让控件假设Listbox和Button都在同一个面板中,或者根本不存在Listbox或Button。请参考MSDN有关控件编写的文章以获取一些如何实现此目标的建议。
ControlTemplate
中其他控件的存在。通常应使用TemplatePart
属性进行记录文档。Combobox
控件依赖于其模板中存在TextBox
和Popup
控件。[TemplatePart(name="PART_EditableTextBox", type=typeof(TextBox))]
[TemplatePart(name="PART_Popup", type=typeof(Popup))]
public class Combobox : Selector
{
[...]
命名规则为“PART_controlIdentifier”。
相关项目在控件模板中应该使用相同的名称,以便可以在OnApplyTemplate
方法中找到它们。
这样就允许控件连接到事件,在模板中包含的控件上设置属性和调用方法。
此属性是为了文档目的,以便设计自定义控件模板(以及Expression Blend等工具)的人知道该控件依赖于另一个控件的存在。