WPF: прогулка по дереву анимации, получение родителя или братьев по шкале времени - PullRequest
0 голосов
/ 04 апреля 2020

Я пишу 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. Любые другие идеи, которые я могу попробовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...