Как добавить обратные вызовы в свойство зависимостей видимости элемента инфраструктуры? - PullRequest
1 голос
/ 11 октября 2011

Я использую свойство зависимости, которое обрабатывает появление / исчезновение элемента Framework.

Свойство может обрабатывать анимацию постепенного появления / исчезновения, регистрируя методы обратного вызова для каждого случая, когда свойство Visibility анимированного элемента изменилось.

Это было сделано предыдущим кодером как таковым:

UIElement.VisibilityProperty.AddOwner(typeof (FrameworkElement), new FrameworkPropertyMetadata(Visibility.Visible, VisibilityChanged,                                                                           CoerceVisibility));

Проблема здесь в том, что FrameworkElement уже является владельцем VisibilityProperty и, как таковой, вызывает исключение, которое было отловлено (к счастью) ExpressionBlend.

Чтобы противостоять этой проблеме, я заметил, что в Dependency Properties есть метод «OverwriteMetadata», который позволяет кому-то перезаписывать метаданные данного типа, в моем случае FrameworkElement.

Поэтому я мог бы использовать следующее:

UIElement.VisibilityProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(Visibility.Visible, VisibilityChanged, CoerceVisibility));

Мой вопрос:

Насколько безопасно перезаписывать метаданные видимости FrameworkElement? Если это небезопасно, какие у меня есть альтернативы?

РЕДАКТИРОВАТЬ: Ну, поцарапайте это ... Очевидно, перезапись метаданных вызывает другое исключение: «PropertyMetadata уже зарегистрирован для типа« FrameworkElement ».

Как добавить методы обратного вызова для свойства зависимостей, если я не могу добавить владельца или перезаписать метаданные?

Я вынужден создать класс, производный от FrameworkElement, добавить его в качестве владельца VisibilityProperty и сделать все элементы управления, использующие это свойство, того же типа, что и производный класс?

1 Ответ

2 голосов
/ 11 октября 2011

Если других хуков нет, вы можете использовать DependencyPropertyDescriptor для добавления измененных обработчиков:

var desc = DependencyPropertyDescriptor.FromProperty(FrameworkElement.VisibilityProperty, typeof(FrameworkElement));
desc.AddValueChanged(this.OnVisibilityChanged);

Однако FrameworkElement определяет событие IsVisibleChanged - не могли бы выиспользовать это?

...