Eine Möglichkeit, dies zu tun, ist mit einem benutzerdefinierten Attribut. Wie so ...
Die UIElement
Sie wollen (Usercontrol zum Beispiel) protokollieren:
[UserInterfaceID(ID = "{F436E9B3-C2F6-4CF8-8C75-0A2A756F1C74}")]
public partial class MyUserControl : UserControl
{
InitializeComponent();
// or whatever...
}
Dann müssen Sie die benutzerdefinierte Klasse
[System.AttributeUsage(AttributeTargets.Class)]
public class UserInterfaceIDAttribute : Attribute
{
public Guid ID { get; set; }
}
Jetzt in Ihrem Code-Attribut können Sie tun etwas wie das:
MyUserControl control = new MyUserControl();
foreach(object att in control.GetCustomAttributes(typeof(UserInterfaceAttribute),false))
{
UserInterfaceAttribute uiAtt = (UserInterfaceAttribute)att;
Guid theID = uiAtt.ID;
}
Weil Sie das Steuerelement mit einem Attribut in der Code ändert sich der eindeutige Bezeichner nie, egal wie oft Sie die Anwendung beenden oder starten.
Natürlich ist dies ein grundlegendes Beispiel, das zeigt, wie man auf die ID zugreift, aber Sie werden wahrscheinlich irgendeine Art von aspektorientierter Programmierung verwenden wollen. Genau das mache ich mit Castle Windsor Interceptors, aber das ist außerhalb des Umfangs dieses Posts.
Idealerweise greifen Sie auf diese ID zu, wenn eine Art von Ereignis ausgelöst wird.Mit Interceptors können Sie Methodenaufrufe aufrufen, bevor sie aufgerufen werden, wobei Sie die ID wie oben gezeigt nachschlagen und die Aktion protokollieren können. Alternativ können Sie auch nur
this.GetCustomAttributes(...)
in irgendeiner Methode verwenden, wenn ein Ereignis auf dem Steuerelement ausgelöst wird, und betten Sie Ihren dort Logging-Code. Dieses Muster ist nicht das Beste, weil Sie übergreifende Bedenken über alles streuen, was eine Art von Aspect Oriented Programming Ansatz besser macht ... aber wieder schweife ich ab und es ist außerhalb des Umfangs dieses Beitrags ... aber Sie bekommen das Idee.
Hoffe, das hilft.
Haben Sie die Eigenschaft [FrameworkElement.Name] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.name.aspx) versucht? – DmitryG
Ja Dmitry, aber Name kann leer sein, ich möchte nicht Name auf jeder Kontrolle ausschließlich für die Protokollierung setzen –
@ArsenMkrt, die [PersistId] (http://msdn.microsoft.com/en-us/library/ system.windows.uielement.persistid.aspx) scheint genau das zu sein, wonach Sie suchen. Leider ist es jetzt veraltet und hat anscheinend keinen Ersatz. Vielleicht können Sie auf die Generierung eindeutiger Identifikatoren zurückgreifen, in diesem Fall siehe [diese Frage] (http://stackoverflow.com/q/750947/464709). –