代码之家  ›  专栏  ›  技术社区  ›  Sheridan

在xaml中设置时,WPF附加的属性不在后面触发代码

  •  4
  • Sheridan  · 技术社区  · 14 年前

    我有一个自定义的ClockFace用户控件,它具有允许更改颜色、字体和指针(作为路径对象)的属性。这在自定义时间选择器和时钟用户控件中使用。在这些父控件中,可以在xaml中的ClockFace对象上设置ClockFace属性。 我要做的是公开这些时钟面属性,以便可以在这两个父控件(例如时钟和计时器选择器对象)上设置它们。我认为让它们附加属性可以做到这一点,所以我尝试了其中一种颜色属性。

    public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached("HourTicksBrush", typeof(Brush), typeof(ClockFace), new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender));
    public static void SetHourTicksBrush(DependencyObject element, Brush value)
    {
        element.SetValue(HourTicksBrushProperty, value);
    }
    public static Brush GetHourTicksBrush(DependencyObject element)
    {
        return (Brush)element.GetValue(HourTicksBrushProperty);
    }
    

    <Controls:Clock Controls:ClockFace.HourTicksBrush="Aqua" />
    

    它编译得很好,但是尽管所附HourTicksBrushProperty的默认值(Brushes.Black)显示,父时钟控件(Aqua)上设置的值从不触发上述方法或更改颜色。我遗漏了什么吗?

    为了清楚起见,我希望能够在父控件上使用上面的xaml来设置子时钟面控件的HourTicksBrush属性。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Rob Fonseca-Ensor    14 年前

    附加属性类中的“get”和“set”方法实际上只是用于您自己的代码隐藏的方便方法。XAML解析器忽略这些,调用element.SetValue本身。如果要响应setter,则必须为 FrameworkPropertyMetadata

    public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached(
        "HourTicksBrush", 
        typeof(Brush), 
        typeof(ClockFace), 
        new FrameworkPropertyMetadata(
            Brushes.Black, 
            FrameworkPropertyMetadataOptions.AffectsRender,
            HourTicksBrushChanged));
    
    public static void SetHourTicksBrush(DependencyObject element, Brush value)
    {
        element.SetValue(HourTicksBrushProperty, value); //not always called
    }
    public static Brush GetHourTicksBrush(DependencyObject element)
    {
        return (Brush)element.GetValue(HourTicksBrushProperty); //not always called
    }
    private static void HourTicksBrushChanged(DependencyObject sender, somethingsomethingArgs args){
        // do stuff with sender and args.NewValue here
    }
    
        2
  •  0
  •   Maarten Van Genechten    14 年前

    使用类似于:

    public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached("HourTicksBrush", typeof(Brush), typeof(ClockFace), new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender));
    
    
    public static Brush HourTicksBrush
    {
        get { return (Brush)GetValue(HourTicksBrushProperty); }
        set { SetValue(HourTicksBrushProperty); }
    }
    

    <Controls:Clockface.HourTicks Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HourTicksBrush}/>
    

    我不确定是否在相对资源中使用TemplatedParent或Self