Design-Time Support в Compact Framework
От: Beliar  
Дата: 25.01.10 09:34
Оценка:
Доброго времени суток!

Столкнулся с такой проблемой. Разрабатываю свой контрол (требуется возможность загрузки 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 не может найти редактор.

К сожалению я исчерпал идеи как это можно исправить. Возможно у кого-то они есть?
Re: Design-Time Support в Compact Framework
От: Beliar  
Дата: 28.01.10 07:59
Оценка:
Неужели со времен выхода VS 2008 никто не пытался написать свой редактор свойств для CF приложений???
Re[2]: Design-Time Support в Compact Framework
От: Beliar  
Дата: 29.01.10 10:37
Оценка:
Нашел решение.

Проблема была в том, что я указал не всю информацию о сборке с редактором. Хотя параметры 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, который его использовал, иначе работать будете со старой версией!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.