Una forma de hacerlo es con un atributo personalizado. Al igual que ...
El UIElement
desea iniciar sesión (por ejemplo, control de usuario):
[UserInterfaceID(ID = "{F436E9B3-C2F6-4CF8-8C75-0A2A756F1C74}")]
public partial class MyUserControl : UserControl
{
InitializeComponent();
// or whatever...
}
Luego hay la costumbre atributo de clase
[System.AttributeUsage(AttributeTargets.Class)]
public class UserInterfaceIDAttribute : Attribute
{
public Guid ID { get; set; }
}
En su código, puede hacer algo como esto:
MyUserControl control = new MyUserControl();
foreach(object att in control.GetCustomAttributes(typeof(UserInterfaceAttribute),false))
{
UserInterfaceAttribute uiAtt = (UserInterfaceAttribute)att;
Guid theID = uiAtt.ID;
}
Porque está etiquetando el control con un atributo en el código, el identificador único nunca cambia, no importa cuántas veces mates/ejecutes la aplicación.
Por supuesto, este es un ejemplo básico que muestra cómo acceder a la ID, pero es probable que desee utilizar algún tipo de Programación Orientada a Aspectos. Hago exactamente este tipo de cosas usando Castle Windsor Interceptors, pero eso está fuera del alcance de esta publicación.
Lo ideal es que accedas a esta ID cuando hay algún tipo de evento que se activa.El uso de interceptores le permite ir a las llamadas al método de captura antes de invocarlas, en donde puede buscar el ID como se muestra arriba y registrar la acción. Como alternativa, puede simplemente usar
this.GetCustomAttributes(...)
de algún método cuando se activa un evento en el control e incrustar el código de registro allí. Este patrón no es el mejor porque estás rociando preocupaciones transversales por todas partes haciendo que algún tipo de enfoque de Programación Orientada a Aspectos sea mejor ... pero de nuevo estoy divagando y está fuera del alcance de esta publicación ... pero obtienes la idea.
Espero que esto ayude.
¿Ha probado la propiedad [FrameworkElement.Name] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.name.aspx)? – DmitryG
Sí, pero el nombre puede estar vacío, no quiero poner Nombre en cada control exclusivamente para fines de registro –
@ArsenMkrt, el [PersistId] (http://msdn.microsoft.com/en-us/library/ la propiedad system.windows.uielement.persistid.aspx) parece ser lo que estás buscando. Por desgracia, ahora está obsoleto y aparentemente no tiene reemplazo. Tal vez pueda recurrir a la generación de identificadores únicos, en ese caso, consulte [esta pregunta] (http://stackoverflow.com/q/750947/464709). –