Доброго времени суток!
Столкнулся с такой проблемой. Разрабатываю свой контрол (требуется возможность загрузки png с прозрачностью). В нем имеется свойство моего типа — AlphaImage. Стандартный Design-Time редактор для изображений использовать нельзя — загрузка png стандартными средствами гробит альфаканал (ну во всяком случае таково было мое исходное предположение

).
За сим написал свой простейший редактор AlphaImageEditor (вызывает диалог открытия файла и загружает изображение):
public class AlphaImageEditor : UITypeEditor
{
private OpenFileDialog openDialog;
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{...}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override bool GetPaintValueSupported(ITypeDescriptorContext context)
{
return true;
}
public override void PaintValue(PaintValueEventArgs e)
{
Graphics graphics = e.Graphics;
AlphaImage img;
if (e.Value != null)
{
img = (AlphaImage)e.Value;
img.Draw(graphics, e.Bounds);
}
graphics.DrawRectangle(Pens.Black, e.Bounds);
}
protected virtual AlphaImage LoadFromStream(Stream stream)
{
return AlphaImage.CreateFromStream(stream);
}
}
Далее прописал этот редактор свойству моего контрола в *.xmta файле:
<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
<Class Name="Transparency.Controls.TransparentPanel">
<DesignTimeVisible>true</DesignTimeVisible>
<Property Name="Image">
<Browsable>true</Browsable>
<Category>Apeerance</Category>
<Editor>
<Type>Transparency.Design.AlphaImageEditor, Transparency.Design</Type>
<BaseType>System.Drawing.Design.UITypeEditor</BaseType>
</Editor>
<EditorBrowsable>Always</EditorBrowsable>
</Property>
</Class>
</Classes>
Далее разместил контрол на форме. В проперти грид свойство Image не появилось
Дальнейшие пляски с бубном подтвердили, что:
1. Свойство не отображается так как для него не найдено подходящего редактора
2. Мой редактор Visual Studio не подцепила
Попытался создать контрол и редактор для его свойства для полного фреймворка — работает без всяких проблем. Очевидно проблема во взаимодействии Compact-сборок и сборок полного фреймворка. Т.е. при разработке контрола для Compact Framework приходится описывать сам контрол в Smart Device сборке, а редактор в Windows Class Library, которая ссылается на сборку для Smart Device.
Вероятно из-за этого дищайнер Visual Studio не может найти редактор.
К сожалению я исчерпал идеи как это можно исправить. Возможно у кого-то они есть?
Неужели со времен выхода VS 2008 никто не пытался написать свой редактор свойств для CF приложений???
Нашел решение.
Проблема была в том, что я указал не всю информацию о сборке с редактором. Хотя параметры Culture, Version и PublicKeyToken являются в большинстве случаев необязательными и используются, только если имеется две сборки с одинаковыми именами, в данном случае без них работать не будет.
И того вот краткая последовательность действий по добавлению к контролу своего редактора свойств:
1. Реализуем контрол
2. Добавляем в сборку с контролом *.xmta файл с Design-Time атрибутами.
3. Указываем в этом файле редактор, используемый для свойства нашего контрола. Получается что-то вроде этого:
<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
<Class Name="Transparency.Controls.TransparentPanel">
<DesignTimeVisible>true</DesignTimeVisible>
<Designer>
<Type>System.Windows.Forms.Design.ParentControlDesigner, System.Design</Type>
</Designer>
<Property Name="Image">
<Category>A</Category>
<Editor>
<Type>Singularis.Design.ImageFileEditor, Singularis.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2157e22d4cb3b52d</Type>
<BaseType>System.Drawing.Design.UITypeEditor, System.Drawing</BaseType>
</Editor>
<TypeConverter>Singularis.Design.ImageFileTypeConverter, Singularis.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2157e22d4cb3b52d</TypeConverter>
</Property>
<Property Name="BackgroundImage">
<Browsable>false</Browsable>
</Property>
</Class>
<Class Name="Transparency.Controls.BaseTransparentControl">
<DesignTimeVisible>false</DesignTimeVisible>
</Class>
</Classes>
4. Создаем сборку для десктопа и описываем в ней свой редактор
5. Переопределяем в редакторе методы EditValue, GetEditStyle (определяет как будет отображаться редактор — выпадающим оном, модальным диалогом и или простым текстбоксом), GetPaintValueSupported (в большинстве случаев можно просто вернуть false)
6. Компилируем сборку с редактором
7. Регистрируем сборку с редактором в GAC
8. Кидаем наш кастом контрол на форму и наслаждаемся кастом редактором
P.S. Редактор, конверторы типов и прочие вкусности WinForms дизайнера загружаются при первом обращении. Так что если вы перекомпилировали сборку с редактором, придется перезапустить тот экземпляр VS, который его использовал, иначе работать будете со старой версией!