4

我有一个自定义的 ClockFace UserControl,它具有允许更改颜色、字体和手(作为 Path 对象)的属性。这用于自定义 TimePicker 和时钟用户控件。在这些父控件中,可以在 xaml 中的 ClockFace 对象上设置 ClockFace 属性就好了。我要做的是公开这些 ClockFace 属性,以便可以在这两个父控件(例如 Clock 和 TimePicker 对象)上设置它们。我认为使它们成为附加属性就可以了,所以我尝试了其中一种颜色属性。

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);
}

我可以在 Clock 所在的 xaml 中使用这个附加属性:(Controls 是 xml 命名空间)

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

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

需要明确的是,我希望能够在父控件上使用上述 xaml 来设置子 ClockFace 控件的 HourTicksBrush 属性。

任何帮助将非常感激。

4

2 回答 2

6

附加属性类中的那些“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
}
于 2010-10-18T20:33:06.067 回答
0

使用类似的东西:

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); }
}

以及 XAML 中的类似内容

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

我不确定是在 RelativeSource 中使用 TemplatedParent 还是 Self

于 2010-10-17T18:36:15.087 回答