如何在后面的代码中访问C#Metro UI中的数据模板内的Control

我有一个MediaElement驻留在flipview的datatemplate中,我想在后面的代码中访问名为“video”的MediaElement,以便我可以通过按钮分配播放,暂停等属性这里是我的代码试图做:

                       

我如何实现预期目标?

请尝试以下方法:

  private DependencyObject FindChildControl(DependencyObject control, string ctrlName) { int childNumber = VisualTreeHelper.GetChildrenCount(control); for (int i = 0; i < childNumber; i++) { DependencyObject child = VisualTreeHelper.GetChild(control, i); FrameworkElement fe = child as FrameworkElement; // Not a framework element or is null if (fe == null) return null; if (child is T && fe.Name == ctrlName) { // Found the control so return return child; } else { // Not found it - search children DependencyObject nextLevel = FindChildControl(child, ctrlName); if (nextLevel != null) return nextLevel; } } return null; } 

然后从播放/暂停按钮按钮调用它:

  MediaElement media = FindChildControl(this, "media") as MediaElement; media.Play(); 

关于这个主题的相关博客文章

一年前我写了一篇关于这个话题的博客文章。 也许它会对你有所帮助: http : //blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

要点是这个。 您必须通过可视树解析以获取所有元素,然后您可以使用LINQ之类的东西来过滤结果并获取对象。

我将Jerry的解决方案扩展到更灵活,更好的性能解决方案,只获得所需的控件,并且在递归调用期间不创建中间列表。

您可以简单地使用这样来获得控件:

 var myControl = AllChildren(parent, c => c.Name == "xxx").FirstOrDefault(); 

为此,您应该包括以下AllChildrenfunction:

  private List AllChildren(DependencyObject parent, Func query, List _List = null ) { if (_List == null) _List = new List(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var _Child = VisualTreeHelper.GetChild(parent, i); if (_Child is Control && query(_Child)) { _List.Add(_Child as Control); } AllChildren(_Child, query, _List); } return _List; }