Файл конструктора IExtenderProvider и WinForms - PullRequest
1 голос
/ 24 апреля 2009

C # 3.5 Winforms ...

Итак, я недавно обнаружил IExtenderProvider и то, как его можно использовать для расширения элементов управления дополнительными свойствами.

В проекте-прототипе, который я настраивал, я ставил точку останова на метод "set" для своего свойства extendee, и когда форма загружалась, я мог видеть, как метод "set" выполняется для каждого элемента управления в форме; это именно то, что я хотел. После успешного прототипа я внедрил компонент extender в свой основной проект. Все формы в моем проекте наследуются от базовой формы, в которую я добавил свой компонент-расширитель. В базовой форме я установил модификатор компонента-расширителя в public, чтобы он был доступен для формы, наследующей эту базовую форму.

Делая то же самое, прежде чем я добавил точку останова в метод "set" для моего свойства extendee, но этот метод не выполняется для элементов управления в форме (но только для элементов управления в базовой форме). ПОМОГИТЕ!

Мне, вероятно, следует добавить, что мой источник контролировал мои формы, и поэтому большинство из них проверены (т.е. заблокированы от модификации). Для форм, которые я извлек и изменил свойство провайдера; В файле конструктора я заметил, что у всех элементов управления есть дополнительный оператор, который вызывает метод «set» свойства провайдера.

this.MyProvider1.SetMyProperty (this.txtTextBox1, false);

Прав ли я, полагая, что для работы компонента-расширителя он должен физически изменить файл конструктора или он должен справиться с заблокированными файлами и, следовательно, динамически вызывать метод set? Я предполагаю, что если он действительно должен изменить файл конструктора, то это не проблема для новых форм или форм, которые модифицируются после добавления компонента-расширителя в проект - но это будет проблемой, если у вас есть 101 форма, все заблокированные источником -safe ...

Буду признателен за любые мысли ...

Ответы [ 3 ]

1 голос
/ 24 июня 2009

В какой момент поставщик расширителя (IExtenderProvider) расширяет «тип» (в моем случае элемент управления winforms), для которого предназначен расширитель; во время разработки или во время выполнения?

Дизайнер отвечает за отображение свойств расширителя в редакторе свойств
. Метод bool CanExtend(object) из интерфейса IExtenderProvider

Прав ли я, полагая, что для работы компонента-расширителя он должен физически изменить файл конструктора или он должен справиться с заблокированными файлами и, следовательно, динамически вызывать метод set?

Он должен физически изменить файл конструктора и записать в него расширенные свойства

Полагаю, если нужно изменить файл конструктора, то это не проблема для новых форм или форм, которые модифицируются после добавления компонента-расширителя в проект, но это будет проблемой, если у вас будет 101 форма. заблокирован безопасным источником ...

Это не проблема для новых форм, и не для старых форм .
Если вы хотите установить некоторые расширенные свойства, откройте старую форму и установите расширенные свойства (необходима выписка из файла)

0 голосов
/ 25 мая 2011

Одной из проблем может быть цикл foreach в методе EndInit:

Control control = item as Control;

if (control != null)
    continue;

Если элемент фактически является элементом управления, вы выходите из цикла перед выполнением этого кода:

control.HelpRequested += new HelpEventHandle(HelpProvider_HelpRequested);
_toolTip.SetToolTip(control, GetHelpText(control));

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

Спасибо, John

0 голосов
/ 26 июня 2009

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

Я пытался перехватить метод свойства Set, чтобы также добавить и удалить обработчик событий для компонента (если компонент был элементом управления). Изображение для свойства является логическим и при значении false добавляет дескриптор события и, следовательно, поведение по умолчанию (при значении true не добавляется обработчик события)

Короче говоря, для элементов управления, которые были частью вновь добавленных форм, автоматически добавляется обработчик событий, даже если я явно не установил свойство в false, но файл конструктора старых форм никогда не модификатор, поэтому обработчик событий не добавлено.

В качестве фона я пытался добавить глобальный обработчик событий для всех элементов управления. Глобальный обработчик событий для всех элементов управления справки пользователя

Тема здесь - добавить контекстную справку к моим формам. Вот пример расширителя (обработчик событий добавляется как часть конечного инициализатора)

открытый частичный класс HelpProvider: Component, IExtenderProvider, ISupportInitialize

... другой код расширителя опущен ...

    #region ISupportInitialize Members

    public void BeginInit()
    {
        // do nothing
    }

    public void EndInit()
    {
        if (DesignMode)
            return;

        foreach (Component item in _disableOnlineHelp)
        {
            if (item == null)
                continue;

            if (GetDisableOnlineHelp(item)) // developer has decide to set property to TRUE
                continue;

            Control control = item as Control;

            if (control != null)
                continue;

            control.HelpRequested += new HelpEventHandler(HelpProvider_HelpRequested);
            _toolTip.SetToolTip(control, GetHelpText(control));
        }
    }

    #endregion

    #region DisableOnlineHelp Provider Property

    public virtual bool GetDisableOnlineHelp(Component component)
    {
        object flag = _disableOnlineHelp[component];

        if (flag == null)
            return false;

        return (bool)flag;
    }

    public virtual void SetDisableOnlineHelp(Component component, bool value)
    {
        _disableOnlineHelp[component] = value;
    }

    #endregion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...