我在How can I find WPF controls by name or type?中找到了有关此问题的有趣问题,但我只想让我的方法返回其中的所有控件。只要方法返回他可以找到的所有可能的控件,控件的名称或类型就无所谓了。
答案 0 :(得分:0)
在 WinForms 中,这非常简单...只需抓取WinForms容器,然后探测'.Controls'属性并迭代返回的控件集合。< / p>
foreach (System.Windows.Forms.Control ctrl in form.Controls)
{
if (ctrl.Name == "tabPageControl")
{ // do something with 'tabPageControl object' }
{
正如你在WinForms中看到的那样,它很容易在全局容器中访问以返回'ControlCollection',然后如果它是一个面板或类似的东西则迭代甚至更深。一旦找到了你想要的东西,只需建立一个可以找到的内容列表,然后对你的列表或你的控件做一些事情。
在 WPF 中,这样做略有不同。我没有广泛的WPF经验但是在玩了15分钟之后,我想出了这个:
private void button1_Click(object sender, RoutedEventArgs e)
{
// cast out Grid object.
Grid grd = (Grid) this.Content;
// do simple testing to find out what the type is.
string s = grd.ToString();
// in VS, in debug mode, hover 'grd.Children' and Smart Tool Tip that pops
// it will tell exactly under a 'count' property how many controls there are sitting
// on the global container. For me it was just 1, my Button.
foreach (UIElement child in grd.Children)
{
// do some more testing to make sure have got the right control. pref in an If statement but anyhooo.
String sss = child.GetType().FullName;
// cast out the appropriate type.
Button myWpfButton = (Button)child;
}
}
我希望这能让你开始。
答案 1 :(得分:0)
这取决于父控件的类型。如果它是ContentControl的扩展,则它只能有一个子元素,可以在Content属性下找到。 如果它是Panel的扩展,它可以有许多子元素,可以在Children属性下找到。
不能保证这些子元素中的任何一个都必然是控件 - 您需要进行一些类型检查以确认它们是否属于您感兴趣的类型。
这也仅适用于单级父级子层次结构,但如果您需要所有子控件,则应该足够简单以进行递归。