C# 在XAML中获取子控件的更聪明的方法是什么?

C# 在XAML中获取子控件的更聪明的方法是什么?,c#,.net,xaml,C#,.net,Xaml,我有一个用户控件,包含一个网格,包含一个子控件 我想从用户控件的代码隐藏中获取对子控件的引用 这就是我所拥有的: var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute"); 丑陋得像被碾过的垃圾桶盖 什么是更简洁的方法呢?可能是这样,给你的孩子取个x

我有一个用户控件,包含一个网格,包含一个子控件

我想从用户控件的代码隐藏中获取对子控件的引用

这就是我所拥有的:

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

丑陋得像被碾过的垃圾桶盖


什么是更简洁的方法呢?

可能是这样,给你的孩子取个x:名字

 var childControl = (MyChildControlType)MyGridNameFromXAMLNameAttribute.FindName("MyChildControlNameFromXAMLNameAttribute");

也许是这样,给你的孩子取个x:名字

 var childControl = (MyChildControlType)MyGridNameFromXAMLNameAttribute.FindName("MyChildControlNameFromXAMLNameAttribute");

为XAML中的元素指定一个名称或x:Name,除非它位于模板中,否则会使该元素作为具有该名称的字段从代码隐藏中访问。这基本上已经在InitializeComponent期间为您声明和填充了:

MyChildControlType MyChildControlNameFromXAMLNameAttribute;
您可以直接使用它:

MyChildControlNameFromXAMLNameAttribute.Visibility = Visibility.Hidden;

为XAML中的元素指定一个名称或x:Name,除非它位于模板中,否则会使该元素作为具有该名称的字段从代码隐藏中访问。这基本上已经在InitializeComponent期间为您声明和填充了:

MyChildControlType MyChildControlNameFromXAMLNameAttribute;
您可以直接使用它:

MyChildControlNameFromXAMLNameAttribute.Visibility = Visibility.Hidden;

你可以按照前面的建议,选择名字狩猎:

var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc");
或者,如果您想要一种更通用的方法来处理您已经尝试过的内容,例如,如果您想通过其他属性进行查找,您可以尝试:

var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().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;
}

但实际上,如果你能像约翰·伯恩所说的那样,从代码隐藏中命名并访问它,这是迄今为止最简单的方法。

你可以按照已经提出的建议,使用名称搜索:

var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc");
或者,如果您想要一种更通用的方法来处理您已经尝试过的内容,例如,如果您想通过其他属性进行查找,您可以尝试:

var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().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;
}

但如果你能像约翰·伯恩所说的那样,从代码隐藏中命名并访问它,那真的是最简单的。

丑陋得像一个被碾过的垃圾桶盖。你想要那个元素做什么?不应在代码隐藏中操纵XAML元素。请为该子元素指定一个x:Name属性,作为垃圾桶盖上的运行。你想要那个元素做什么?XAML元素不应在代码隐藏中进行操作。请给孩子一个x:Name属性。如果你不熟悉代码隐藏、查看模板等,其他内容仍然可以使用。这里不需要:解释这些字段是如何在代码隐藏中神奇地弹出的:如果您不熟悉代码隐藏、查看模板等,则其他内容仍然很有用。这里不需要这些内容:解释这些字段如何在代码隐藏中神奇地弹出: