Имя субконтроля в пользовательском элементе управления не найдено - PullRequest
0 голосов
/ 04 февраля 2019

Я использую WPF 4.5.2 C # 7 в .Net 4.7.2

Я хочу добавить EventTrigger с анимацией StoryBoard по коду.В Xaml это будет выглядеть так (протестировано, работает)

<!-- in the control template -->
<Viewport3D x:Name="PART_Viewport" Visibility="Hidden" Width="Auto" Height="Auto">       
    <!-- ... -->        
</ViewPort>


<!-- in the trigger -->
<EventTrigger RoutedEvent="local:MyCustomControl.MyEvent">
    <BeginStoryboard>
        <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Viewport"  Storyboard.TargetProperty="Visibility">
                <!-- ... -->
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </BeginStoryboard>      
</EventTrigger>

В пользовательском классе управления это выглядит так:

public override void OnApplyTemplate()
{
    DiscreteObjectKeyFrame frameStart = new DiscreteObjectKeyFrame() { KeyTime = new TimeSpan( 0 , 0 , 0 ) , Value = Visibility.Visible , };
    DiscreteObjectKeyFrame frameEnd = new DiscreteObjectKeyFrame() { KeyTime = new TimeSpan( 0 , 0 , 0 , 1 , 100 ) , Value = Visibility.Hidden , };

    ObjectAnimationUsingKeyFrames objectAnimationUsingKeyFrames = new ObjectAnimationUsingKeyFrames()
    {
        Name = "PART_ViewPort"
    };

    Storyboard.SetTargetName( objectAnimationUsingKeyFrames , "PART_Viewport" );
    Storyboard.SetTargetProperty( objectAnimationUsingKeyFrames , new PropertyPath( "Visibility" ) );

    objectAnimationUsingKeyFrames.KeyFrames.Add( frameStart );
    objectAnimationUsingKeyFrames.KeyFrames.Add( frameEnd );
}

Создание EventTrigger работает нормально, но вызов вызывает эту ошибку«Имя« PART_Viewport »не может быть найдено в пространстве имен MyNameSpace.MyCustomControl»

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Я не понял всех деталей вашего примера, но мне удалось сгенерировать очень похожую ошибку.

Я определил пользовательский элемент управления 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 ) ;
}

Это основано на идее этого потока переполнения стека .Если это не работает для вас, другие ответы в этой теме могут помочь.

0 голосов
/ 04 февраля 2019

Вы должны добавить объект в раскадровку детей:

StoryBoardObject.Children.Add(objectAnimationUsingKeyFrames);
...