根据继承的属性设置依赖属性的默认值

时间:2013-01-22 15:26:04

标签: wpf inheritance custom-controls dependency-properties default-value

我正在创建一个自定义控件库,我开始使用一个简单的圆边分隔符,但有些东西我似乎无法做到。

我有一个CornerRadius依赖属性,如果没有定义CornerRadius,我希望CornerRadius等于Height / 2,否则取用户值。我在构造函数中初始化高度,使其永远不为空

我知道如何为依赖项属性定义默认值,但我不知道如何,或者是否可以根据控件的高度设置CornerRadius值。到目前为止,我已经搜索了一段时间。

Xaml文件

<!-- Rounded Separator -->
<Style TargetType="{x:Type local:RoundedSeparator}" BasedOn="{StaticResource {x:Type Separator}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:RoundedSeparator}">

                <!-- Mask for round edges -->
                <Grid Height="{TemplateBinding Height}"
                      Width="{TemplateBinding Width}">
                    <Border Name="PART_TitleBarMask" 
                            CornerRadius="{TemplateBinding CornerRadius}"
                            Background="White"/>

                    <Grid>
                        <Grid.OpacityMask>
                            <VisualBrush Visual="{Binding ElementName=PART_TitleBarMask}"/>
                        </Grid.OpacityMask>

                        <!-- Separator -->
                        <Rectangle Fill="{TemplateBinding Background}"/>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

.cs文件

public class RoundedSeparator : Separator
{
    static RoundedSeparator()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(RoundedSeparator), new FrameworkPropertyMetadata(typeof(RoundedSeparator)));
    }

    public RoundedSeparator()
    {
        this.Height = 100;
        this.Background = Brushes.Black;
    }

    public static readonly DependencyProperty CornerRadiusProperty = 
        DependencyProperty.Register("CornerRadius", 
                                    typeof(CornerRadius), 
                                    typeof(RoundedSeparator), 
                                    new UIPropertyMetadata(default(CornerRadius));

    public CornerRadius CornerRadius
    {
        get { return (CornerRadius)GetValue(CornerRadiusProperty); }
        set { SetValue(CornerRadiusProperty, value); }
    }
}

1 个答案:

答案 0 :(得分:0)

尝试:

  static RoundedSeparator()
  {
       DefaultStyleKeyProperty.OverrideMetadata(typeof(RoundedSeparator), new FrameworkPropertyMetadata(typeof(RoundedSeparator)));

      RoundedSeparator.HeightProperty.OverrideMetadata
               (typeof(RoundedSeparator), new FrameworkPropertyMetadata(new PropertyChangedCallback(HeightPropertyChanged)));
  }


  private static void HeightPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
         // Do what you will .... :)
  }