.Net 4.7.2에서 WPF 4.5.2 C# 7을 사용하고 있습니다.
코드로 StoryBoard 애니메이션이 있는 EventTrigger를 추가하고 싶습니다. 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 생성은 제대로 작동하지만 호출하면 "MyNameSpace.MyCustomControl의 네임스페이스에서 "PART_Viewport" 이름을 찾을 수 없습니다"라는 오류가 발생합니다.
내가 도대체 뭘 잘못하고있는 겁니까?
귀하의 예에 대한 모든 세부 사항을 이해하지는 못했지만 매우 유사한 오류를 생성했습니다.
라우트된 이벤트 Tap을 사용하여 vp3d라는 사용자 지정 컨트롤을 정의했습니다. 사용자 정의 컨트롤이 사용되는 위치에서 다음과 같이 이벤트 핸들러를 지정했습니다.
<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 ) ;
}
이것은 이 스택 오버플로 스레드 의 아이디어를 기반으로 합니다 . 이것이 작동하지 않으면 해당 스레드의 다른 답변이 도움이 될 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다