找不到自定义控件中的子控件名称
Name of subcontrol in custom control not found
我在 .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>
在自定义控件中class看起来像这样
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 工作正常,但调用会引发此错误
"The name "PART_Viewport" 在 MyNameSpace.MyCustomControl" 的命名空间中找不到"=12=]
我做错了什么?
您应该在情节提要子中添加对象:
StoryBoardObject.Children.Add(objectAnimationUsingKeyFrames);
我还没有理解你的例子的每一个细节,但我设法产生了一个非常相似的错误。
我定义了一个名为 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 ) ;
}
这是基于 this stack overflow thread 中的一个想法。如果这对您不起作用,该线程中的其他答案可能会有所帮助。
我在 .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>
在自定义控件中class看起来像这样
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 工作正常,但调用会引发此错误 "The name "PART_Viewport" 在 MyNameSpace.MyCustomControl" 的命名空间中找不到"=12=]
我做错了什么?
您应该在情节提要子中添加对象:
StoryBoardObject.Children.Add(objectAnimationUsingKeyFrames);
我还没有理解你的例子的每一个细节,但我设法产生了一个非常相似的错误。
我定义了一个名为 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 ) ;
}
这是基于 this stack overflow thread 中的一个想法。如果这对您不起作用,该线程中的其他答案可能会有所帮助。