Я пишу MarkupExtension
для использования в анимациях WPF XAML. Я вижу, как я могу использовать IProvideValueTarget
, чтобы получить TargetObject
, который использует это расширение разметки. Однако я изо всех сил пытаюсь выяснить, как получить этого Timeline
' родителя Timeline
, если применимо. Например, если я использую свое расширение в DoubleAnimation
, которое находится внутри Storyboard
, я хотел бы иметь возможность получить упомянутое, содержащее Storyboard
. Моя конечная цель - найти предыдущего родного брата Timeline
, предполагая, что TargetObject
находится в TimelineGroup
с другими Timeline
детьми.
Я вижу, что могу использовать IRootObjectProvider
чтобы получить элемент root. Предполагая, что это FrameworkElement
(что было бы , а не , если, скажем, ResourceDictionary
), я мог бы попытаться каким-то образом использовать FindResource
, но я не знал бы, какой ключ передать в Я попытался LogicalTreeHelper.GetParent(provideValueTarget.TargetObject)
, но это вернуло null
.
Есть ли какой-нибудь способ "пройтись" по дереву анимации программно?
РЕДАКТИРОВАТЬ:
Я надеялся, что LogicalTreeHelper.GetParent
поможет, но, видимо, только для использования с FrameworkElement
/ FrameworkContentElement
.
Я вижу, что есть DependencyObject.InheritanceParent
это выглядит многообещающе, но это internal
. Я даже пытался получить к нему доступ, но, похоже, не могу, потому что у меня нет ReflectionPermission
для RestrictedMemberAccess
:
var provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
var targetObject = provideValueTarget.TargetObject;
var inheritanceParentProperty = typeof(DependencyObject).GetProperty("InheritanceParent", BindingFlags.Instance | BindingFlags.NonPublic);
var inheritanceParent = inheritanceParentProperty.GetValue(targetObject); // returns null
Это, вероятно, к лучшему, так как в любом случае не для publi c. Любые другие идеи, которые я могу попробовать?