Один из способов сделать это - с помощью пользовательского атрибута. Вот так ...
UIElement
, в который вы хотите войти (например, UserControl):
[UserInterfaceID(ID = "{F436E9B3-C2F6-4CF8-8C75-0A2A756F1C74}")]
public partial class MyUserControl : UserControl
{
InitializeComponent();
// or whatever...
}
Тогда вам нужен класс пользовательских атрибутов
[System.AttributeUsage(AttributeTargets.Class)]
public class UserInterfaceIDAttribute : Attribute
{
public Guid ID { get; set; }
}
Теперь в своем коде вы можете сделать что-то вроде этого:
MyUserControl control = new MyUserControl();
foreach(object att in control.GetCustomAttributes(typeof(UserInterfaceAttribute),false))
{
UserInterfaceAttribute uiAtt = (UserInterfaceAttribute)att;
Guid theID = uiAtt.ID;
}
Поскольку вы помечаете элемент управления с помощью атрибута в коде, уникальный идентификатор никогда не изменяется независимо от того, сколько раз вы удаляете / запускаете приложение.
Конечно, это базовый пример, который показывает, как получить доступ к идентификатору, но вы, вероятно, захотите использовать какой-либо аспектно-ориентированное программирование. Я делаю именно такие вещи, используя Castle Windsor Interceptors, но это выходит за рамки этого поста.
В идеале вы будете получать доступ к этому идентификатору, когда происходит какое-то событие, которое запускается. Использование перехватчиков позволяет вам перехватывать вызовы методов до их вызова, где вы можете найти идентификатор, как показано выше, и записать действие. Кроме того, вы можете просто использовать
this.GetCustomAttributes(...)
в каком-то методе, когда событие срабатывает в элементе управления и вставляет туда свой код регистрации. Эта модель не самая лучшая, потому что вы разбрасываете сквозные проблемы повсюду, делая какой-то подход к аспектно-ориентированному программированию лучше ... но я опять отвлекся, и это выходит за рамки этого поста ... но вы получите идея.
Надеюсь, это поможет.