我有一个包含Grid的User Control,其中包含一个子控件.
我想从用户控件的后台代码中获取对子控件的引用.
这就是我所拥有的:
var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute");
Run Code Online (Sandbox Code Playgroud)
丑陋的垃圾可以盖上盖子.
什么是更简洁的方法呢?
您可以按照已经建议的方式使用名称搜索:
var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc");
Run Code Online (Sandbox Code Playgroud)
或者,如果你想要一个更通用的方法来处理你已经尝试过的东西(例如,如果你想通过不同的属性查找),你可以尝试:
var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().Single(f => f.Name == "Blah");
Run Code Online (Sandbox Code Playgroud)
要么
var childControl = (MyChildControlType)this.Grid.Children.OfType<MyChildControlType>().Single(f => f.Name == "Blah");
Run Code Online (Sandbox Code Playgroud)
或者您可以使用VisualTreeHelper,它可以与非网格一起使用,如果您需要递归可视化树,它将特别有效:
for(int i = 0; i < VisualTreeHelper.GetChildrenCount(this.Grid); ++i)
{
var child = VisualTreeHelper.GetChild(this.Grid, i) as FrameworkElement;
if (child != null && child.Name == "Blah")
return child;
}
Run Code Online (Sandbox Code Playgroud)
但实际上,如果您可以命名并从代码隐藏中访问它,就像John Bowen所说的那样,这是迄今为止最简单的.