什么是在XAML中获得子控件的更智能方法?

时间:2013-02-12 04:11:17

标签: c# .net xaml

我有一个包含Grid的User Control,其中包含一个子控件。

我想从用户控件的后台代码中获取对子控件的引用。

这就是我所拥有的:

var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute");

丑陋的垃圾可以淹没。

这是一个更简洁的方法吗?

3 个答案:

答案 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");