Главная » C#, Компоненты » Сложное свойство

0

является классом, объединяющим несколько свойств. Для нашего класса градиентной заливки GradientLabel сложное свойство может объединять свойства startcoior и EndCoior. Пример такого класса я привел в листинге 8.1, а листинг 8.2 показывает обновленный класс GradientLabel, использующий новое свойство. Фактически я сохранил всю функциональность. Свойства startcoior и EndCoior, как и раньше, сохраняют начальный н конечный цвета градиентной заливки.

Листинг 8 1 Класс СЛОЖНОГО сиоиства &ra.Uenfc?arftimjLerD

using System;

using System.Collections.Generic; using System.Text; using System.Drawing; using System.ComponentModel;

namespace MyControl {

[TypeConverter(typeof(GradientConverter))] public class GradientParameters

{

Color startColor; Color endColor;

// Делегат, вызываемый при изменении свойств public delegate void PropertyChangedEventHandler(

string propertyname); public event PropertyChangedEventHandler PropertyChanged;

// Конструктор

public GradientParameters(Color startColor, Color endColor)

{

this.startColor = startColor; this.endColor = endColor;

}

// Цвет начала заливки

[Category("Gradient"), Description("Цвет начала заливки"), DefaultValue(typeof(Color), "LightGreen")]

public Color StartColor

{

get { return startColor; } set {startColor = value;

DoPropertyChangedf"StartColor"}; }

}

// Цвет завершения заливки [Category("Gradient"},

Description("Цвет завершения заливки"), DefaultValue(typeof(Color), "DarkBlue"}] public Color EndColor

{

get ( return endColor; } set ( endColor = value;

DoPropertyChanged("EndColor"); }

}

// Вызывается при изменении свойств заливки private void DoPropertyChanged(string name) (

if (PropertyChanged != null) PropertyChanged(name);

}

// Преобразование строкового представления параметров public static GradientParameters Parse(string value)

{

// Делим строку на две части

stringf] v = ((string) value) . Split (new char[] (          }};

return new GradientParameters(

Color.FroroNaroefv[0]}, Color.FroroNarae(v[1]));

}

// Преобразование параметров в строку public override string ToString()

{

return s tring.Format("(0}, (1}",

StartColor.ToKnownColor(), EndColor.ToKnownColor());

Листинге 2 Класс MadientL-iljoi, использующии сноистио типа Gr «': он Г Par lift- Г/ч ь

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Text;

using System.Windows.Forms;

namespace MyControl {

[Toolboxltem(true)]

[ToolboxBitmap(typeof (GradientLabel)., "GradientLabel.bmp") ] [DesignerAttribute(typeof(GradientLabelDesigner))]

public partial class GradientLabel i Label

{

GradientParameters gradient = new GradientParameters( Color.LightGreen, Color.DarkBlue);

public GradientLabel()

{

InitializeComponent();

// Подписываемся на изменение свойств заливки Gradient.PropertyChanged +=

new GradientParameters.PropertyChangecffiventHandler( Gradient_PropertyChanged);

}

[Category("Gradient"}]

[Description("CBOftcTBa градиентной заливки")]

public GradientParameters Gradient

{

get { return gradient> ) set { gradient = value; }

}

protected override void OnPaint(PaintEventArgs pe}

{

// Вызываем базовый OnPaint base.OnPaint(pe};

// Заливаем

Color cl = Color.FromArgbdOO, Gradient.StartColor) ; Color c2 – Color.FromArgbflOO, Gradient.EndColor); Brush b = new Drawing2D.LinearGradientBrush(

ClientRectangle, cl, c2, 10); pe.Graphics.FillRectangle(b, ClientRectangle);

b.Dispose();

}

// Обработчик изменения свойств градиентной заливки

void Gradient__PropertyChanged(string propertyname)

{

// Перерисовать компонент Invalidate();

}

}

1

Научить компонент реагировать на изменение "внутренних" свойств (т. е. свойств, которые находятся внутри сложного свойства) можно двумя способами. Вариант первый — добавить специальный делегат proper tyChanged, который позволит подписываться на изменение внутренних свойств класса Gradientproperties (кстати, обратите внимание, что я использовал стандартный ТИП делегата PropertyChangedEventHandler, применяемый при уведомлениях об изменении свойств, а в качестве параметра передается имя изменившегося свойства):

// Цвет начала заливки public Color StartColor

}

get { return startColor; } set { startColor = value;

DoPropertyChanged{"StartColor"); }

}

// Вызывается при изменении свойств заливки private void DoPropertyChanged(string name) I

if (PropertyChanged != null) PropertyChanged(name);

}

Второй вариант реализации — добавить таким свойствам атрибут NotifyParentProperty, означающий, что при изменении значения свойства необходимо уведомить об этом "внешнее" свойство:

[NotxfyParentProperty(true)] public GradientParameters Gradient

{

get { return gradient; } set { gradient = value; }

}

Наиболее интересными в последнем листинге являются методы ToString о н parsed. Первый позволяет получать строковое представление для нашего класса (как видно из кода, это значения полей startColor и EndColor, перечисленных через запятую), а второй— производить обратное преобразование, т. е. на основе строкового представления заполнять поля класса GradientParameters. Именно эти методы позволят редактору свойств работать со строковым представлением. Теперь осталось только научить его понимать это представление.

Литература:

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

По теме:

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