Я не понял всех деталей вашего примера, но мне удалось сгенерировать очень похожую ошибку.
Я определил пользовательский элемент управления vp3d с перенаправленным событием Tap.В месте, где используется пользовательский элемент управления, я указал обработчик событий следующим образом:
<cc:vp3d Grid.Row="2">
<cc:vp3d.Triggers>
<EventTrigger RoutedEvent="cc:vp3d.Tap">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Viewport" Storyboard.TargetProperty="Visibility">
<!-- ... -->
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</cc:vp3d.Triggers>
</cc:vp3d>
PART_Viewport определен в ControlTemplate.
Вы можете получить доступ к этому имени, используя методGetTemplateChild в пользовательском элементе управления, но я не думаю, что вы можете ссылаться на него извне пользовательского элемента управления.
Однако, если я добавлю следующий код в метод OnApplyTemplate в пользовательском элементе управления, похоже, это исправитпроблема.
public override void OnApplyTemplate ( )
{
base.OnApplyTemplate ();
var vp = GetTemplateChild ("PART_Viewport") as Viewport3D;
RegisterName ("PART_Viewport", vp ) ;
}
Это основано на идее этого потока переполнения стека .Если это не работает для вас, другие ответы в этой теме могут помочь.