自定义控件样式类型的依赖属性

本文关键字:依赖 属性 类型 样式 自定义控件 | 更新日期: 2023-09-27 18:06:15

在自定义控件中,我想在我的模板中使用TextBlock的样式(给定为DependencyProperty)。

MyControl.cs

public static DependencyProperty HeadingStyleProperty =
    DependencyProperty.Register("HeadingStyle",
                                typeof (Style),
                                typeof (MyControlElement),
                                new PropertyMetadata(new Style(typeof(TextBlock))));
public Style HeadingStyle {
    get { return (Style) GetValue(HeadingStyleProperty); }
    set { SetValue(HeadingStyleProperty, value); }
}

MyControl.xaml

<ResourceDictionary ...>
    <Style TargetType="local:MyControl">
        <Style.Resources>
            <!-- Getting error on BasedOn="TemplateBinding -->
            <Style TargetType="TextBlock" BasedOn="{TemplateBinding HeadingStyle}" x:Key="Heading" />
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Style="{StaticResource Heading}" Text="StyledHeading" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

我得到编译错误'HeadingStyle'成员是无效的,因为它没有一个合格的类型名称。

我是否必须将我的DP的数据类型从Style修改为更具体的数据类型?或者是什么导致了这个错误。DP的初始值设置为Style for TargetType TextBlock…

自定义控件样式类型的依赖属性

首先,Style 不是派生自DependencyObject,因此您不能对其设置任何绑定。

如果你想让你的TextBlock(这是模板的一部分)被你的属性样式化,简单地将TemplateBinding直接设置在它的Style属性上(你定义为资源的样式的目的是什么?)。这可以通过两种方式实现。一种是使用完全限定的属性名:

<ControlTemplate>
    <TextBlock Style="{TemplateBinding local:MyControl.HeadingStyle}" (...) />
</ControlTemplate>

另一种更常用的方法是使用简化的属性名,但它需要指定ControlTemplate.TargetType:

<ControlTemplate TargetType="{x:Type local:MyControl}">
    <TextBlock Style="{TemplateBinding HeadingStyle}" (...) />
</ControlTemplate>

第二个方法是有效的,因为XAML解析器足够聪明,知道如何解析HeadingStyle属性——如果你没有指定ControlTemplate.TargetType,你会得到与现在完全相同的错误。

你当然可以通过使用完全限定属性名来欺骗编译器来编译你的代码:

<Style x:Key="Heading" BasedOn="{TemplateBinding local:MyControl.HeadingStyle}" (...) />

但是这会导致运行时错误,说TemplateBindingExpression不能转换为Style