我有一个包含Grid的User Control,其中包含一个子控件。
我想从用户控件的后台代码中获取对子控件的引用。
这就是我所拥有的:
var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute");
丑陋的垃圾可以淹没。
这是一个更简洁的方法吗?
答案 0 :(得分:5)
你可以按照已经建议的方式进行狩猎:
var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc");
或者,如果你想要一个更通用的方法来解决你已经尝试过的问题(例如,如果你想通过不同的属性查找),你可以尝试:
var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().Single(f => f.Name == "Blah");
或
var childControl = (MyChildControlType)this.Grid.Children.OfType<MyChildControlType>().Single(f => f.Name == "Blah");
或者您可以使用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;
}
但实际上,如果您可以命名并从代码隐藏中访问它,就像John Bowen所说的那样,这是迄今为止最简单的。
答案 1 :(得分:2)
为XAML中的元素分配名称或x:名称(除非它在模板内)使得该元素可以从代码隐藏中作为具有该名称的字段进行访问。所以这基本上已经在InitializeComponent期间为你声明和填充:
MyChildControlType MyChildControlNameFromXAMLNameAttribute;
你可以直接使用它:
MyChildControlNameFromXAMLNameAttribute.Visibility = Visibility.Hidden;
答案 2 :(得分:1)
可能是这样,给你的childControl提供x:名称
var childControl = (MyChildControlType)MyGridNameFromXAMLNameAttribute.FindName("MyChildControlNameFromXAMLNameAttribute");