Как добавить логику к существующему обратному вызову зависимостей?
Я пытаюсь добавить свойство PropertyChangedCallback в UIElement.RenderTransformOriginProperty. Исключение возникает при попытке переопределить PropertyMetadata.
Я искал MSDN и Google, и все, что я смог придумать, this. DependencyPropertyDescriptor.AddValueChanged предлагается в какой-то момент в этом сообщении, но это не решит мою проблему, так как это не обратный вызов для каждого экземпляра.
Я не понимаю, что это исключение означает вообще. Кто-нибудь знает, что я делаю неправильно?
public class foo : FrameworkElement
{
private static void Origin_Changed( DependencyObject d,
DependencyPropertyChangedEventArgs e)
{ }
static foo()
{
PropertyMetadata OriginalMetaData =
UIElement.RenderTransformOriginProperty.GetMetadata(
typeof(FrameworkElement));
/*An exception is thrown when this line is executed:
"Cannot change property metadata after it has been associated with a property"*/
OriginalMetaData.PropertyChangedCallback +=
new PropertyChangedCallback(Origin_Changed);
UIElement.RenderTransformOriginProperty.OverrideMetadata(
typeof(foo), OriginalMetaData);
}
}
Ответы
Ответ 1
WPF объединит метаданные свойств для вас, когда вы вызываете OverrideMetadata, не нужно передавать ему оригинальный объект метаданных. Итак, все, что вам нужно сделать, это
UIElement.RenderTransformOriginProperty.OverrideMetadata(typeof(foo), new PropertyMetadata(new PropertyChangedCallback(Origin_Changed)));
Одна вещь, о которой нужно знать, иногда код выше выдает исключение. В двух случаях, когда это происходит,
1. Оригинальные метаданные являются подклассом PropertyMetadata - я видел FrameworkPropertyMetadata и UIPropertyMetadata. Вам просто нужно использовать соответствующий в каждом случае.
2. Свойство зависимостей доступно только для чтения, и вы ничего не можете с этим поделать.