Главная » C#, Компоненты » Сервис IPropertyValueUIService

0

предоставляет возможность отобразить рядом с именем свойства специальный значок (и даже не один), задать обработчик двойного щелчка на этом значке и установить всплывающую подсказку.

Это дает дополнительные возможности редактору свойств. Например, я покажу, как использовать этот сервис для отображения ошибочных значений.

Пусть свойство Test компонента PropertyUiComponent (листинг 7.21) должно принимать только положительные значения. В более сложных случаях можно добавить условие, что отрицательные значения считаются ошибочными, в зависимости от других свойств компонента. Но для примера нам достаточно простого условия.

Как обычно, интерфейс сервиса мы получаем в аксессоре set свойства site, Этот метод вызывается только в режиме разработки, что позволяет избегать некорректных действий в режиме выполнения. Если значение свойства site не равно null, мы устанавливаем делегат сервиса, вызывая метод AddPropertyVaiueuiHandier{). Если же site равно null, то делегат удаляется С помощью вызова метода RemovePropertyValueUIHandlerO. Делегат, зарегистрированный в сервисе, вызывается для каждого свойства компонента всякий раз, когда нужно отобразить свойство (первый раз или при изменении значения). Разумеется, все самые интересные вещи происходят в самом обработчике, который имеет три параметра:

private void testPropertyValueUIHandler(

ITypeDescriptorContext context, PropertyDescriptor propDesc, ArrayList it emList)

С помощью первого параметра можно получить ссылку на сам компонент и, соответственно, к значениям всех свойствам компонента:

PropertyUiComponent component =

(PropertyUiComponent)context.Instance;

Второй параметр передает дескриптор свойства, для которого вызывается делегат. Третий параметр передает список значков, добавляемых к свойству, Каждый значок описывается классом PropertyValueUiitem.

Конструктор класса PropertyValueUiitem имеет три параметра: картинка, делегат, вызываемый при двойном щелчке на картинке, и подсказка, отображаемая при подведении на картинку курсора мыши:

new PropertyValueUIItem(img/

new PropertyValueUIItemlnvokeHandler(this.testlnvoke), "Необходимо значение большее нуля")

Картинку мы загрузим из ресурсного файла:

Image img = new Bitmap(typeof(Resourcel), "Error.bmp");

Делегат, вызываемый по двойному щелчку, в нашем примере содержит очень простой код, инвертирующий знак значения свойства:

int value = (int)propDesc.GetValue(this); propDesc.SetValue(this, -value);

Сам делегат имеет три параметра: контекст context, дескриптор свойства propDesc и ссылку на картинку item. С помощью ссылки на компонент context.instance можно проводить более сложный анализ свойств или изменять любые другие свойства, отличные от того, на котором был произведен щелчок.

Получившийся компонент имеет свойство Test. Если установить значение этого свойства меньше или равное нуля, то рядом с именем свойства будет показан красный восклицательный знак, означающий, что свойство имеет некорректное значение (рис. 7.12). Эту функциональность можно использовать не только при отображении ошибочных значений, но и для отображения любой другой информации.

Листинг 7 21 Использование сервиса iPropertyValuoUiberv-ue для отображении ошибочных значении

using System;

using System. Collections;

using System.ComponentModel;

using System. ComponentModel .Design;

using System. Drawing;

using System.Drawing.Design;

using System. 10;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System. Windows. Forms;

using System. Windows. Forms . Design;

using System. Resources;

using MyControl;

namespace PropertyValueUIServiceExample

}

// Тестовый компонент

public class PropertyUIComponent : UserControl {

// Тестовое свойство. С помощью сервиса IPropertyValueUiService // подключается изображение, подсказка и реакция на двойной // щелчок на картинке. Но только если значение // свойства меньше нуля.

private int test = 10;

[Description("Значения >0 верны. Значения <= 0 ошибочны!")] public int Test

{

get {

return test;

}

set {

test = value;

}

)

// Делегат, который вызывает сервис.

// Делегат вызывается для каждого свойства компонента, private void testPropertyValueUIHandler(

ITypeDescriptorContext context,

PropertyDescriptor propDesc, ArrayList itemList)

{

// Ссылка на компонент PropertyUIComponent component =

(PropertyUIComponent)context.Instance;

// Если это свойство Test

if (propDesc.DisplayName.Equals("Test")) {

if ((int)propDesc.GetValue(this) <= 0) {

// Загружаем картинку из ресурсов

Image img = new Bitmap(typeof(Resourcel), "Error.bmp"); // Устанавливаем картинку и обработчик двойного щелчка itemList.Add(new PropertyValueUIItem(img,

new PropertyValueUIItemlnvokeHandler( this.testlnvoke), "Необходимо значение большее нуля"});

}

)

}

// Вызывается при двойном щелчке на картинке private void testlnvoke(ITypeDescriptorContext context, PropertyDescriptor propDesc, PropertyValueUIItem item)

{

if (MessageBox.Show("Скорректировать знак числа?",

"Ошибка", Mes s ageBoxButtons.YesNo) == Di alogResult.Yes)

{

// Меняем знак значения свойства int value = (int)propDesc.GetValue(this); // Устанавливаем новое значение propDesc.SetValue(this, -value);

}

)

// Установка сервиса. Вызывается только в режиме разработки, public override ISite Site

{

get

{

return base.Site;

}

set

{

// Если Site != null, устанавливаем обработчик

if {value != null) {

base.Site = value; // Получить ссылку на сервис TPropertyValueUlService uiService = (IPropertyValueUIService)

this.GetService(typeof(IPropertyValueUIService)); if (uiService != null) f

// Установить обработчик uiService.AddPropertyValueUIHandler( new propertyValueUXHandler(

this.testPropertyValueUlHandler));

}

)

// Если Site равно null, удаляем обработчик

else {

// Получить ссылку на сервис IPropertyValueUIService uiService = (IPropertyValueUIService)

this.GetService(typeof(IPropertyValueUIService));

if (uiService != null) {

// Удалить обработчик

uiService.RemovePropertyValueUIHandler( new PropertyValueUIHandler(

this.testPropertyValueUIHandler));

}

base.Site = value;

}

}

}

}

}

Рис. 7.12. Отображение картинки рядом с именем свойства

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии