2010-06-17 70 views
4

给定对XAML中定义的对象的引用,是否可以确定x(对象是否为x):对象具有的名称,还是我只能通过访问FrameworkElement.Name属性来执行此操作(如果对象是FrameworkElement) ?你可以采取如何从代码中获取x:对象的名称?

+1

你拥有的对象引用将基于的名称对象已经,不是吗?你还有什么可以获得在xaml中定义的对象引用? – VoodooChild 2010-06-17 23:34:37

+0

在由IServiceProvider.GetService获取的自定义MarkupExtension中。 – devios1 2010-06-17 23:46:02

+0

@VoodooChild通过导航可视/逻辑对象树。 – Neutrino 2013-08-29 15:10:49

回答

5

一种方法是首先检查如果对象是一个FrameworkElement,如果没有,尝试反射来获取名称:

public static string GetName(object obj) 
{ 
    // First see if it is a FrameworkElement 
    var element = obj as FrameworkElement; 
    if (element != null) 
     return element.Name; 
    // If not, try reflection to get the value of a Name property. 
    try { return (string) obj.GetType().GetProperty("Name").GetValue(obj, null); } 
    catch 
    { 
     // Last of all, try reflection to get the value of a Name field. 
     try { return (string) obj.GetType().GetField("Name").GetValue(obj); } 
     catch { return null; } 
    } 
} 
+0

这就是我最终做的......并且还检查FrameworkContentElement,因为它们是不同的分支,但都具有Name属性。 – devios1 2010-06-18 19:50:32

+0

也许在这种情况下,值得使用'dynamic'? – GregRos 2014-03-19 12:31:31