2010-10-17 3 views
4

У меня есть пользовательский пользовательский элемент ClockFace UserControl, который имеет свойства, позволяющие изменить цвета, шрифт и руки (как объекты Path). Это используется в пользовательских TimePicker и Clock UserControls. В этих родительских элементах свойства ClockFace могут быть установлены на объекте ClockFace в xaml просто отлично. Что я пытаюсь сделать, это разоблачить эти свойства ClockFace, чтобы их можно было установить на этих двух родительских элементах управления (например, объекты Clock и TimePicker). Я думал, что сделать их Attached properties сделает трюк, поэтому я попытался с одним из свойств цвета.Свойства, прикрепленные WPF, не закорачиваются при установке в xaml

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

я могу использовать это вложенное свойство в XAML, где Часы с: (Controls является XML-пространства)

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

Это компилируется нормально, но, хотя значение по умолчанию (Brushes.Black) из прилагаемых показаний HourTicksBrushProperty, значение, установленное на родительском контроле часов (Aqua), никогда не запускает вышеуказанные методы или не меняет цвет. Я что-то упускаю?

Чтобы быть ясным, я хотел бы иметь возможность использовать вышеуказанный xaml в родительском элементе управления, чтобы установить свойство HourTicksBrush дочернего элемента управления ClockFace.

Любая помощь будет высоко оценена.

ответ

6

Те «получить »и« set »в вашем добавленном классе свойств на самом деле являются просто удобными методами для вашего собственного кода. Парсер XAML игнорирует их, вызывая element.SetValue. Если вы хотите, чтобы ответить на сеттера, вы должны предоставить свойство измененную обработчик к 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 
} 
+0

Жаль всем, потому что мой вопрос опустил тот факт, что я хотел поймать входящие значения в коде позади. Дополнительный престиж Робу для угадывания, это то, чем я был. Большое спасибо Робу. – Sheridan

+0

У меня была такая же проблема, как и раньше, поэтому было легко догадаться :) –

+0

Удивление почему SetXXX и GetXXX происходят почти во всех образцах Attached Property and Behavior в блогах через Интернет .. – Elaine

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}/> 

Я не уверен, следует ли использовать TemplatedParent или самостоятельной в RelativeSource

+0

я, возможно, объясняется неправильно. Я обновил xaml, который я использую. У меня нет проблем с xaml ... это просто, что установка значения не вызывает метод SetHourTicksBrush в ClockFace и поэтому не обновляет Brush. – Sheridan

+0

В коде, который вы отправили, ничего не говорится о запуске –

+0

Но почему свойство Brush не обновляется, если установлено на родительском элементе управления, хотя это делает, когда он установлен на текущем элементе управления ClockFace? Или немного изменить вопрос ... как я могу это достичь? – Sheridan