[XAML] 使用 ContentPropertyAttribute 指定 Content,让自订控件可以直接指定 Content

[XAML] 使用 ContentPropertyAttribute 指定 Content,让自订控件可以直接指定 Content


假设我已经建立了一个自订控件名为 DemoControl,并拥有 DemoContent 属性 (如下)
public class DemoControl : Control
{
    public static readonly DependencyProperty DemoContentProperty =
        DependencyProperty.Register("DemoContent", typeof(DependencyObject), typeof(DemoControl), new PropertyMetadata(default(DependencyObject)));
    public DependencyObject DemoContent
    {
        get { return (DependencyObject)GetValue(DemoContentProperty); }
        set { SetValue(DemoContentProperty, value); }
    }
}


若想将一个名为 DemoTextBlock 的 TextBlock 控件指定给 DemoControl 的 DemoContent 属性时,可以写成下列 XAML


    
        
    


若觉得 XAML 阶层太多,或者希望其他开发人员可以直接指定 DemoControl 的内容时 (如下),必须做一些额外处理


    

由于编译器不知道指定的内容需要对应到哪一个属性,所以必须设定 DemoControl 的 ContentPropertyAttribute


[System.Windows.Markup.ContentProperty(nameof(DemoContent))]
public class DemoControl : Control
{
   ...
}

 
完整范例
[System.Windows.Markup.ContentProperty(nameof(DemoContent))]
public class DemoControl : Control
{
    public static readonly DependencyProperty DemoContentProperty =
        DependencyProperty.Register("DemoContent", typeof(DependencyObject), typeof(DemoControl), new PropertyMetadata(default(DependencyObject)));
    public DependencyObject DemoContent
    {
        get { return (DependencyObject)GetValue(DemoContentProperty); }
        set { SetValue(DemoContentProperty, value); }
    }
}