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

0

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

class PositionUIEditor : UlTypeEditor (

bool resizable = true;

public PositionUIEditor(bool resizable} (

this.resizable = resizable;

}

public override bool IsDropDownResizable

{

get (

return resizable;

}

}

}

Для решения этого вопроса придется реализовать новый дескриптор свойства, который содержит вызов редактора, но уже с параметрами. Как я уже говорил, класс propertyDescriptor является абстрактным, и использовать его напрямую нельзя. Поэтому мы сделаем наследника этого класса, но т. к. нам нужно только перекрыть метод вызова редактора, то все другие методы мы переадресуем к исходному дескриптору (листинг 9.16). Подмена редактора выглядит так:

if (editorBaseType — typeof(UlTypeEditor)} // Вызываем редактор с параметром! return new PositionUIEditor(false);

Листинг 9.16. Дескриптор свойства, вызывающий редактор с параметрами

using System;

using System.Collections.Generic; using System.Text;

using System.ComponentModel; using System.Drawing.Design;

namespace MyControl

{

public class PositionPropertyDescriptor : PropertyDescriptor (

private PropertyDescriptor baseProperty; // Сохраняем исходный дескриптор

public PositionPropertyDescriptor(PropertyDescriptor baseProperty) : base(baseProperty)

{

this.baseProperty = baseProperty;

}

// Подменяем редактор

public override object GetEditor(Type editorBaseType) (

if (editorBaseType — typeof(UITypeEditor)) // Вызываем редактор с параметром! return new PositionuiEditor(false); return baseProperty.GetEditor(editorBaseType);

}

// Все остальные методы просто переадресуем к исходным public override bool CanResetValue(object component) (

return baseProperty.CanResetValue(component);

}

public override Type ComponentType (

get { return baseProperty.ComponentType; }

}

public override object GetValue(object component} (

return baseProperty.GetValue(component);

}

public override bool IsReadOnly {

get ( return baseProperty.IsReadOnly; }

public override Type PropertyType

get { return baseProperty.PropertyType; }

public override void ResetValue(object component) baseProperty.ResetValue(component);

public override void SetValue(object component, object value) baseProperty.SetValue(component, value);

public override bool ShouldSerializeValue(object component) return baseProperty.ShouldSerializeValue(component);

}

}

Теперь остается только подменить сам дескриптор. Сделать это можно с помощью добавления к компоненту дизайнера (см. главу 6):

[Designer(typeof(PositionDesigner))] public class MinMaxControl : Control

( }

Класс PositionDesigner перекрывает метод PostFilterProperties О, в котором и происходит подмена дескриптора (листинг 9.17).

Разумеется, при необходимости можно реализовать более сложную логику, согласно нужным параметрам редактора. В этом примере вполне достаточно понимания того, что был вызван конструктор с параметрами, а не конструктор по умолчанию.

Листинг 9 17 Дизаинер, подменяющий дескриптор свойства Position

public class PositionDesigner : ControlDesigner {

protected override void PostFilterProperties(IDictionary properties)

{

// Подменяем дескриптор свойства PropertyDescriptor baseProperty =

(PropertyDescriptor)properti es("Posi ti on"]; properties["Position"] =

new PositionPropertyDescriptor(baseProperty);

}

}

В этой главе я постараюсь рассказать, каким образом среда Visual Studio производит сохранение информации о компонентах на форме.

Литература:

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

По теме:

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