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属性。如果你不熟悉代码隐藏、查看模板等,其他内容仍然可以使用。这里不需要:解释这些字段是如何在代码隐藏中神奇地弹出的:如果您不熟悉代码隐藏、查看模板等,则其他内容仍然很有用。这里不需要这些内容:解释这些字段如何在代码隐藏中神奇地弹出: