C# 在代码中枚举datatemplate内声明的控件?

C# 在代码中枚举datatemplate内声明的控件?,c#,wpf,datatemplate,C#,Wpf,Datatemplate,有没有办法在代码中检查DataTemplate的内容?我想列出datatemplate中的控件,查找特定类型 谢谢 在我看来,最好且推荐的方法是将XamlWriter/XamlReader与linqtoxml结合使用。 例如: string templateXaml = XamlWriter.Save(template); XElement xData = XElement.Parse(templateXaml); XElement xpanel = xData.XPathSelectEle

有没有办法在代码中检查DataTemplate的内容?我想列出datatemplate中的控件,查找特定类型


谢谢

在我看来,最好且推荐的方法是将XamlWriter/XamlReader与linqtoxml结合使用。 例如:

string templateXaml = XamlWriter.Save(template);

XElement xData = XElement.Parse(templateXaml);

XElement xpanel = xData.XPathSelectElements("//*[@IsItemsHost]").FirstOrDefault();
这将找到具有现有IsItemsHost属性的xaml元素

然后,如果希望以编程方式将其作为依赖项对象进行检查,请按如下方式进行转换:

Panel panel = (Panel) XamlReader.Parse(xpanel.ToString());

//example, discover which panel Type it actually is
Type panelType = panel.GetType();
IEnumerable<XElement> typedElements = xData.XPathSelectElements("//SpecificType");

foreach(XElement el in typedElements)
{
    DependencyObject dObj = (DependencyObject) XamlReader.Parse(el.ToString());

    //do something with dObj
}
编辑

另外,为了直接回答您的问题,您还可以编写如下代码:

Panel panel = (Panel) XamlReader.Parse(xpanel.ToString());

//example, discover which panel Type it actually is
Type panelType = panel.GetType();
IEnumerable<XElement> typedElements = xData.XPathSelectElements("//SpecificType");

foreach(XElement el in typedElements)
{
    DependencyObject dObj = (DependencyObject) XamlReader.Parse(el.ToString());

    //do something with dObj
}