【问题标题】:Name of subcontrol in custom control not found未找到自定义控件中的子控件名称
【发布时间】:2019-02-04 09:46:22
【问题描述】:

我在 .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""

我做错了什么?

【问题讨论】:

  • MCVE 会很有帮助。
  • 你在哪里打电话给Storyboard.SetTargetName
  • 请看原帖。

标签: c# wpf custom-controls


【解决方案1】:

我没有理解你的例子的每一个细节,但我设法产生了一个非常相似的错误。

我定义了一个名为 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 中的一个想法。如果这对您不起作用,那么该线程中的其他答案可能会有所帮助。

【讨论】:

  • 感谢 Phil,我没有调用 RegisterName,这导致了错误。 . var vp = GetTemplateChild ("PART_Viewport") as Viewport3D; RegisterName ("PART_Viewport", vp ) ; .是相关行
【解决方案2】:

您应该在故事板子项中添加对象:

StoryBoardObject.Children.Add(objectAnimationUsingKeyFrames);

【讨论】:

  • 感谢您的回答,我稍后会这样做,我只是没有显示该行,因为将关键帧添加到情节提要时不会引发错误。碰巧创建 Eventtrigger 时永远不会抛出错误,而是调用它并且动画应该运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多