【发布时间】:2011-05-26 20:18:56
【问题描述】:
如果我有以下 XAML:
我可以从视图中通过 this.FindName("form") 获得对“form”的引用。数据模板>
如何获得对“堆栈”的引用? FindName 返回空值。
【问题讨论】:
标签: silverlight silverlight-4.0
如果我有以下 XAML:
我可以从视图中通过 this.FindName("form") 获得对“form”的引用。数据模板>
如何获得对“堆栈”的引用? FindName 返回空值。
【问题讨论】:
标签: silverlight silverlight-4.0
这里的问题是DataTemplate 的xaml 内容与外部Xaml 属于不同的NameScope。对元素调用 FindName 只会搜索最初生成该元素的 NameScope。因此在UserControl 上调用FindName 将找不到由DataTemplate 生成的元素。这样做的原因是 DataTemplate(和其他模板)被设计为可以多次重复使用,使用 NameScope 可以消除名称的歧义。
解决方案是调用VisualTreeHelper 的帮助,查看blog 中的代码以了解我对VisualTreeHelper 的看法。将该博客中的 VisualTreeEnumeration 类添加到您的项目中后,您可以执行以下操作:-
var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
当然,如果您知道“堆栈”是 StackPanel,那么您可以使用 .OfType<T> 获得更具体的信息。
【讨论】: