从CodeBehind访问DataTemplate中的XAML控件?

我有一个我无法在代码隐藏中访问的控件,我相信这是因为它是在DataTempalte中定义的。

整体控制是幻灯片旋转木马。 每张幻灯片可以是Image或MediaElement(video),其内容在ItemSource绑定中定义。 旋转木马位于计时器上,可以从一张幻灯片切换到另一张幻灯片。 每次幻灯片更改时,我都会触发一个事件。

当我点击带有video的幻灯片时,我想停止幻灯片计时器(完成该操作)并启动video,这是我遇到问题的地方。 我无法从我的代码隐藏中访问MediaPlayer元素Name 。 我在这一点上的假设是因为它是一个DataTemplate。

这个假设是否正确? 如果是这样,我如何从代码隐藏中访问此控件,或者(更重要的是)在幻灯片启动时开始播放?

           ...           

我通常建议不要从代码中触摸UIElements …但MediaElement是一个特殊情况…也许你应该将整个模板包装在一个usercontrol(可能有一些自定义DepProps)中,这样可以让你更好地控制整个事情。

编辑:另一种方法是创建一个具有几个属性的行为(例如IsPlaying)并从那里操纵mediaelement。 然后,您可以在DataTemplate的XAML中使用此行为,而无需代码隐藏或usercontrols。

WPF提供了一种简单直接的方法来访问从DataTemplates生成的命名元素。 它在MSDN文章如何:查找DataTemplate生成的元素中进行了解释 。

假设您的AutoScrollCarousel派生自ItemsControl,您将获得ContentPresenter,它是项目的容器,如下所示:

 AutoScrollCarousel carousel = ... object item = ... var contentPresenter = carousel.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter; 

在ContentPresenter中,您将通过FindName方法获取DataTemplate中的命名元素:

 var dataTemplate = contentPresenter.ContentTemplate; var mediaPlayer = dataTemplate.FindName("MediaPlayer", contentPresenter) as MediaElement;