Окончательный вариант пользовательского интерфейса должен выглядеть приблизительно как показано на рис. 6.
Рис. 6. Приблизительный вид пользовательского интерфейс элемента управления ActiveX
Как только все элементы пользовательского интерфейса добавлены, перейдите в режим просмотра кода, путем двойного щелчка на любом элементе на форме и добавьте следующие атрибуты в класс SampleUI:
- [ComVisible(true)]
- [Guid("BC97AC9D-4851-49CF-A5F8-F8C51B0753EF")]
- [ClassInterface(ClassInterfaceType.None)]
- [ComDefaultInterface(typeof(IMyFirstActiveX))]
- [ComSourceInterface(typeof(IMyFirstActiveXEvents))]
Затем, в классе SampleUI необходимо реализовать интерфейс IMyFirstActiveX. Для этого необходимо имя интерфейса добавляется в определение класса как показано ниже.
public partial class SampleUI : UserControl, IMyFirstActiveX
Для использования выше указанных атрибутов в классе SampleUI, также необходмо подключить пространство имен System.Runtime.InteropServices, как описывалось выше.
Реализация свойств и методов
Фактически реализация свойств и методов выглядит следующим образом:
- При изменении значения свойства происходит следующее:
- Обновление текстового поля графического интерфейса, которое отображает текущее значение соответствующего свойства
- Инициирование события OnValueChanged. Это происходит через вызов метода ValueChanged
- Добавление новой строки в ListView, информирующий об изменении значения свойства
Для всех методов, откуда бы они не вызывались, добавляется новая строка в ListView, включающая имя метода и аргументы, которые были переданы методу.
ListView обновляется через вызов метода UpdateListView.
Свойство StrProperty
public string StrProperty
{
get
{
UpdateListView("Значение свойства StrProperty было запрошено!");
return strProperty;
}
set
{
if (strProperty != value)
{
strProperty = value; txtStrProperty.Text = value;
ValueChanged("StrProperty");
UpdateListView("Значение свойства StrProperty было изменено на: " + value);
}
}
}
Свойство IntProperty
public int IntProperty
{
get
{
UpdateListView("Значение свойства IntProperty было запрошен!");
return intProperty;
}
set
{
if (intProperty != value)
{
intProperty = value;
txtIntProperty.Text = value.ToString();
ValueChanged("IntProperty");
UpdateListView("Значение свойства IntProperty было изменено на: " + value.ToString());
}
}
}
Свойство FloatProperty
public float FloatProperty
{
get
{
UpdateListView("Значение свойства FloatProperty было запрошен!");
return floatProperty;
}
set
{
if (floatProperty != value)
{
floatProperty = value; txtFloatProperty.Text = value.ToString();
ValueChanged("FloatProperty");
UpdateListView("Значение свойства FloatProperty было изменено на: " + value.ToString());
}
}
}
Метод SampleMethod
{
UpdateListView("Метод SampleMethod() выполнен!");
}
Метод SampleMethodWithArgs
{
UpdateListView(string.Format("Метод SampleMethodWithArgs({0}) выполнен!", arg1));
}
Вспомогательные методы
Реализация событий
События реализуются с помощью делегатов. Сигнатуры делегатов (т.е. возвращаемое значение и аргументы) должны совпадать с сигнатурами событий определенных в интерфейсе (в нашем случае в интерфейсе IMyFirstActiveXEvents). Имена событий также должны совпадать с именами делегатов.