Един от начините да направите това е с персонализиран атрибут. Така...
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(...)
в някакъв метод, когато се задейства събитие на контролата и вградете своя код за регистриране там. Този модел не е най-добрият, защото вие разпръсквате междусекторни опасения навсякъде, за да направите някакъв вид подход за аспектно ориентирано програмиране по-добър...но отново се отклонявам и това е извън обхвата на тази публикация...но получавате идея.
Надявам се това да помогне.
person
Ricky
schedule
20.04.2012